您的位置:首页 > 其它

关于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;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: