问题描述
Dog.h
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic,retain) Person *owner;
@end
Person.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic,retain) Dog *dog;
@end
Dog的dealloc函数中有[Person dealloc],Person的dealloc函数中有[Dog dealloc]
main.m
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new]; //1
Dog *d = [Dog new]; //1
NSLog(@"%lu , %lu",p.retainCount,d.retainCount);// 1 , 1
//人有一条狗
p.dog = d;
d.owner = p;
NSLog(@"%lu %lu",p.retainCount,d.retainCount);// 2 , 2
[p release]; //0
NSLog(@"%lu %lu",p.retainCount,d.retainCount);// 1 , 2
[d release]; //
NSLog(@"%lu %lu",p.retainCount,d.retainCount);//1 , 1
}
return ;
}
p.dog = d;
d.owner = p;
这两句执行完毕后是这样子的:
[ p release] ;执行完毕后是这样子的:
[d release]; 执行结束是这样子,于是造成内存泄露
解决方法
让一段使用@property的assign参数
例如在Dog.h中
@property (nonatomic,assign) Person *owner;
由于不是retain,在Dog的dealloc函数中不需要在写[_owner dealloc];
就可以解决问题。具体原因可以同上面的分析得出结论。