@propertyretain有什么作用?

问题描述

| @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
。永远不会。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...