問題描述
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];
就可以解決問題。具體原因可以同上面的分析得出結論。