问题描述
|
@propert(retain)有什么作用?它实际上并没有通过测试保留我的对象:
id obj = getobjectSomehow();
NSLog(@\"%d\",[obj retainCount]);
propertyWithRetain = obj;
NSLog(@\"%d\",[obj retainCount]);
// output:
// 1
// 1
我如何才能创建一个真正保留对象的属性?
解决方法
您不在那儿使用您的财产,这就是为什么它没有保留!
尝试这个 :
id obj = getObjectSomehow();
NSLog(@\"%d\",[obj retainCount]);
self.propertyWithRetain = obj; // Note the self. :)
NSLog(@\"%d\",[obj retainCount]);
使用self.
将使用该属性。仅使用变量名是不会的。
尤其是对@bbum进行编辑(他在评论中提出了一个非常公平的观点)
不要依赖于使用keepCount-您不知道还有什么保留了您的对象,并且您不知道这些保留中的某些是否实际上是计划的自动发布,因此它通常是一个令人误解的数字:)
, propertyWithRetain = obj;
这只是将ivar设置为直接支持该属性。合成@property时,如果未声明实例变量,则将自动生成一个实例变量。上面是直接使用该ivar。
self.propertyWithRetain = obj;
这实际上将通过5 d setter并增加保留计数。
这也是为什么我们许多人使用ѭ6来使iVar的名称有所不同的原因。
请注意,即使在这种情况下,呼叫retainCount
也会令人产生极大的误导。尝试使用[NSNumber numberWithInt: 2];
或常量字符串。真的,不要叫retainCount
。永远不会。