// // main.m #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { Person *p = [Person new]; Dog *d = [Dog new]; p.dog = d; [p release]; [d release]; return 0; }
// // Person.h #import <Foundation/Foundation.h> //#import "Dog.h" @class Dog; //.h文件写@class,.m文件写import,提高效率和防止重复导入。 /* 总结: 如果两个类相互拷贝, 例如A拷贝B, B拷贝A, 这样会报错 如何解决: 在.h中用@class, 在.m中用import 因为如果.h中都用import, 那么A拷贝B, B又拷贝A, 会形成死循环 如果在.h中用@class, 那么不会做任何拷贝操作, 而在.m中用import只会拷贝对应的文件, 并不会形成死循环.因为.m文件没有相互引用。 */ @interface Person : NSObject @property(nonatomic, retain)Dog *dog; @end
// Person.m #import "Person.h" #import "Dog.h" @implementation Person - (void)dealloc { NSLog(@"%s", __func__); [_dog release]; [super dealloc]; } @end
// // Dog.h #import <Foundation/Foundation.h> //#import "Person.h" @class Person; @interface Dog : NSObject @property(nonatomic, retain)Person *owner; @end
// // Dog.m #import "Dog.h" #import "Person.h" @implementation Dog -(void)dealloc { [_owner release]; NSLog(@"%s", __func__); [super dealloc]; } @end