MRC 下,会出现循环 retain 的问题,这种情况下,一次 release 并不能完成释放,如下:
#import <Foundation/Foundation.h>
@class Person;
@interface Car : NSObject
@property (nonatomic , retain ) Person * ownerPerson;
@end
#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
@property (nonatomic , retain ) Car * ownerCar;
@end
- (void)viewDidLoad {
[super viewDidLoad];
Car * mCar = [[Car alloc] init];
Person * mPerson = [[Person alloc] init];
mCar.ownerPerson = mPerson;
mPerson.ownerCar = mCar;
[mCar release];
[mPerson release];
NSLog(@"mCar %ld",[mCar retainCount]);
NSLog(@"mPerson %ld",[mPerson retainCount]);
[mCar release];
[mPerson release];
}
打印结果如下:
2017-11-19 16:18:46.997212+0800 test[4158:362888] mCar 1
2017-11-19 16:18:46.997400+0800 test[4158:362888] mPerson 1
2017-11-19 16:18:46.997501+0800 test[4158:362888] Car dealloc
2017-11-19 16:18:46.997579+0800 test[4158:362888] Person dealloc
因为循环引用的问题,需要再次进行 release,但是这样的处理又不科学,这里解决的时候,可以将 reatin 换为 assign 进行修饰.因为 assign 不会使得引用计数 +1