retain 和 assign 的区别使用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值