两个 class 通过导入它们的头文件(通过 #import )相互访问会导致错误
Two class access each other by importing their head file(via #import ) causes error
两个 class 通过导入它们的头文件(通过 #import )相互访问导致错误?
如果需要访问其他 classes ,总是建议我在头文件中使用 @class className 。但是我很少知道我为什么要这样做的任何原则。下面有一个小示例,它会触发类似“UNKnown type name 'xxxClass'”这样的错误。这是否意味着“#import”没有在此处复制代码?如果不是,为什么它无法检测到“xxxClass”
我觉得这不是循环retain的问题,但是报错的原理是什么?
============================ Person ===============================
Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
//@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog; //Error :UNKnown type name ‘Dog'
@end
Person.m
#import "Person.h"
@implementation Person
- (void)dealloc{ NSLog(@"Person--dealloc");}
@end
============================ Dog ===============================
Dog.h
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Dog : NSObject
@property (nonatomic, weak) Person *person; //Error:UNKnown type name‘Person'
@end
Dog.m
#import "Dog.h"
@implementation Dog
- (void)dealloc{ NSLog(@"Dog--dealloc");}
@end
============================ main ===============================
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main()
{
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
d.person = p;
return 0;
}
基本上,#import
使编译将指定文件的整个文本放入语句所在的文件中。当您有循环 #import
语句时,编译器会变得混乱并抛出错误。这就是为什么你应该使用 @class
来打破这个循环。
@class Dog 的意思是,当它开始编译时,您告诉编译器它将有这个 class (稍后)并且现在不必 include/compile ,
你必须在 header 中使用 @class ,
如果您想从实现(.m 文件)中操作此 object,那么,您可以直接在 .m 文件
中包含 another-classes header 文件 (.h)
//Person.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog;
@end
//Person.m
#import "Person.h"
@implementation Person
- (void)dealloc{ NSLog(@"Person--dealloc");}
@end
//Dog.h
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic, weak) Person *person;
@end
//Dog.m
#import "Dog.h"
// **IF YOU WANT TO HAVE ACCESS TO THE PERSONS OBJECT AND ITS PROPERTIES , INCLUDE ITS HEADER HERE**
@implementation Dog
- (void)dealloc{ NSLog(@"Dog--dealloc");}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main()
{
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
d.person = p;
return 0;
}
两个 class 通过导入它们的头文件(通过 #import )相互访问导致错误?
如果需要访问其他 classes ,总是建议我在头文件中使用 @class className 。但是我很少知道我为什么要这样做的任何原则。下面有一个小示例,它会触发类似“UNKnown type name 'xxxClass'”这样的错误。这是否意味着“#import”没有在此处复制代码?如果不是,为什么它无法检测到“xxxClass”
我觉得这不是循环retain的问题,但是报错的原理是什么?
============================ Person ===============================
Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
//@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog; //Error :UNKnown type name ‘Dog'
@end
Person.m
#import "Person.h"
@implementation Person
- (void)dealloc{ NSLog(@"Person--dealloc");}
@end
============================ Dog ===============================
Dog.h
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Dog : NSObject
@property (nonatomic, weak) Person *person; //Error:UNKnown type name‘Person'
@end
Dog.m
#import "Dog.h"
@implementation Dog
- (void)dealloc{ NSLog(@"Dog--dealloc");}
@end
============================ main ===============================
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main()
{
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
d.person = p;
return 0;
}
基本上,#import
使编译将指定文件的整个文本放入语句所在的文件中。当您有循环 #import
语句时,编译器会变得混乱并抛出错误。这就是为什么你应该使用 @class
来打破这个循环。
@class Dog 的意思是,当它开始编译时,您告诉编译器它将有这个 class (稍后)并且现在不必 include/compile ,
你必须在 header 中使用 @class , 如果您想从实现(.m 文件)中操作此 object,那么,您可以直接在 .m 文件
中包含 another-classes header 文件 (.h)//Person.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, strong) Dog *dog;
@end
//Person.m
#import "Person.h"
@implementation Person
- (void)dealloc{ NSLog(@"Person--dealloc");}
@end
//Dog.h
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic, weak) Person *person;
@end
//Dog.m
#import "Dog.h"
// **IF YOU WANT TO HAVE ACCESS TO THE PERSONS OBJECT AND ITS PROPERTIES , INCLUDE ITS HEADER HERE**
@implementation Dog
- (void)dealloc{ NSLog(@"Dog--dealloc");}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main()
{
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
d.person = p;
return 0;
}