在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;