关于OC中循环引用问题
2015-11-10 20:33
330 查看
在MRC中我们经常遇到循环retain问题导致内存泄露。
Dog类
#import
<Foundation/Foundation.h>
@class
Person;
@interface Dog :
NSObject
@property(nonatomic,retain)
Person*owner;//Dog类中有一个Peson类型的主人
-(void)run;
@end
@implementation Dog
-(void)dealloc{
[_owner
release];//释放_owner
NSLog(@"狗类释放");
[super
dealloc];
}
-(void)run{
NSLog(@"狗狗快跑");
}
**********************分割线***********************
Person类
#import
<Foundation/Foundation.h>
@class
Dog;
@interface Person :
NSObject
@property(nonatomic,retain)
Dog * dog;//而在Person类型中有个Dog类型的狗
-(void)liuDog;
@end
@implementation Person
-(void)liuDog{
[_dog
run];//调用狗跑的方法
}
-(void)dealloc{
[_dog
release];//释放狗类
NSLog(@"person
类释放");
[super
dealloc];
}
@end
运行完并没有像我们想象的那样调用dealloc方法
,显然不管是Dog类还是Person类都没有被释放。
在ARC中同样存在这种问题
@class
Dog;
#import
<Foundation/Foundation.h>
@interface Person :
NSObject
-(void)liuDog;
@property(nonatomic,strong)
Dog *dog;
@end
#import
"Dog.h"
@implementation Dog
-(void)run{
NSLog(@"狗狗快跑");
}
-(void)dealloc{
NSLog(@"狗类释放");
}
@end
Person类
@class
Person;
#import
<Foundation/Foundation.h>
@interface Dog :
NSObject
-(void)run;
@property (nonatomic,strong)Person
*owner;
@end
@implementation Person
-(void)liuDog{
[_dog
run];
}
-(void)dealloc{
NSLog(@"Person类释放");
}
@end
//当你用强指针分别指向狗和人的时候
int main(int argc,
const
char * argv[]) {
@autoreleasepool {
Person *p =[Person
new];
Dog *byd =[Dog
new];
p.dog=byd;
//狗指向人
byd.owner=p;//人指向狗
//这导致了人和狗互相指当程序结束后也不能回收这部分的内存,因为2个对象之间的强指针都互相指,双方都不会被释放,这时候必须让一方指向nil这才会让另一方被释放,从而达到释放双方的目的。让一方使用一个弱指针就能解决这个问题
[p
liuDog];
}
return
0;
Dog类
#import
<Foundation/Foundation.h>
@class
Person;
@interface Dog :
NSObject
@property(nonatomic,retain)
Person*owner;//Dog类中有一个Peson类型的主人
-(void)run;
@end
@implementation Dog
-(void)dealloc{
[_owner
release];//释放_owner
NSLog(@"狗类释放");
[super
dealloc];
}
-(void)run{
NSLog(@"狗狗快跑");
}
**********************分割线***********************
Person类
#import
<Foundation/Foundation.h>
@class
Dog;
@interface Person :
NSObject
@property(nonatomic,retain)
Dog * dog;//而在Person类型中有个Dog类型的狗
-(void)liuDog;
@end
@implementation Person
-(void)liuDog{
[_dog
run];//调用狗跑的方法
}
-(void)dealloc{
[_dog
release];//释放狗类
NSLog(@"person
类释放");
[super
dealloc];
}
@end
运行完并没有像我们想象的那样调用dealloc方法
,显然不管是Dog类还是Person类都没有被释放。
在ARC中同样存在这种问题
@class
Dog;
#import
<Foundation/Foundation.h>
@interface Person :
NSObject
-(void)liuDog;
@property(nonatomic,strong)
Dog *dog;
@end
#import
"Dog.h"
@implementation Dog
-(void)run{
NSLog(@"狗狗快跑");
}
-(void)dealloc{
NSLog(@"狗类释放");
}
@end
Person类
@class
Person;
#import
<Foundation/Foundation.h>
@interface Dog :
NSObject
-(void)run;
@property (nonatomic,strong)Person
*owner;
@end
@implementation Person
-(void)liuDog{
[_dog
run];
}
-(void)dealloc{
NSLog(@"Person类释放");
}
@end
//当你用强指针分别指向狗和人的时候
int main(int argc,
const
char * argv[]) {
@autoreleasepool {
Person *p =[Person
new];
Dog *byd =[Dog
new];
p.dog=byd;
//狗指向人
byd.owner=p;//人指向狗
//这导致了人和狗互相指当程序结束后也不能回收这部分的内存,因为2个对象之间的强指针都互相指,双方都不会被释放,这时候必须让一方指向nil这才会让另一方被释放,从而达到释放双方的目的。让一方使用一个弱指针就能解决这个问题
[p
liuDog];
}
return
0;
相关文章推荐
- 1004. 成绩排名 (20)
- android sqllite数据库使用详解
- leetcode-Reorder List
- webService 的工作原理的介绍
- 【OpenCV人脸识别入门教程之四】LBP人脸识别
- 【算法】插入排序/冒泡排序/选择排序
- 初始化2
- Ubuntu的root用户问题
- 【转】第三方支付风控体系
- Linux下查看文件和文件夹大小(转)
- 【线段树 小模板】
- Android启动过程深入解析
- 注水抽水问题
- 探索MATLAB循环语句内部的变量
- 常浏览的技术网站
- P154、面试题28:字符串的排列
- 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)
- Python调用C程序
- C++模式(三)模板方法模式
- umask命令