问题描述
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 0;
}
p.dog = d;
d.owner = p;
这两句执行完毕后是这样子的:
[ p release] ;执行完毕后是这样子的:
[d release]; 执行结束是这样子,于是造成内存泄露
解决方法
让一段使用@property的assign参数
例如在Dog.h中
@property (nonatomic,assign) Person *owner;
由于不是retain,在Dog的dealloc函数中不需要在写[_owner dealloc];
就可以解决问题。具体原因可以同上面的分析得出结论。
本文详细解析了在Objective-C编程中,通过`@property`定义对象引用时可能导致的内存泄露问题,并提供了修改`assign`类型属性以解决此问题的方法。文章深入分析了对象间的引用关系及`dealloc`函数的作用,通过实例代码演示了解决方案的实现过程。
1079

被折叠的 条评论
为什么被折叠?



