关于self的使用会影响retainCount的总结

关于self的使用会影响retainCount的总结

首先创建对象的方法如下:

MyClass.h
@interface MyClass : NSObject {
    MyObject *myObject;
}

@property (nonatomic, retain) MyObject *myObject;
@end


MyClass.m
@synthesize myObject;

类型一
加self.
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
self.myObject = aMyObject; //myObject retainCount = 2;
[aMyObject release];//myObject retainCount = 1

第一条语句声明并初始化一个MyObject的对象。
第二条语句将aMyObject赋值给当前对象的myObject.
第三条语句将retainCount减一。

因为调用了(self.),所以retainCount会增加1,而后面的release会将retainCount 减1,这样在外部调用autoreleasepool时,该内存将会被释放。


类型二
不加self.
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
myObject = aMyObject; //myObject retainCount = 1;
[aMyObject release];//对象己经被释放

第一条语句声明并初始化了一个MyObject的对象。
第二条语句将指针aMyObject赋值给指针myObject,并不影响内存。
第三条语句将retainCount减1,这时对象被释放。


类型三
self.
self.myObject = [[MyObject alloc] init]; //myObject retainCount = 2;
此语句相当于类型一,只不过是直接将初始化完成后的对象赋值给self.myObject,此时因为调用了(self.),所以retainCount变成了2.


类型四
不加self.
myObject = [[MyObject alloc] init]; //myObject retainCount = 1;

此语句相当于类型二,只不过是直接将初始化完成后的对象赋值给myObject,因为没有调用(self.)方法,所以不影响内存。

简单而言,self.是访问属性的存取方法,对于@property时的参数retain,其内部是

// retain
-(void)setMyObject:(id)newValue{
if (_myObject != newValue) {
    [_myObject release];
    _myObject = [newValue retain];
    }
}

所以此处会调用retain使得retainCount加1。



使用时应该注意(self.)可能会影响retainCount,造成内存泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值