//
// 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