@propert(保留)做什么?它实际上并没有通过我的测试保留我的对象:
id obj = getObjectSomehow();
NSLog(@"%d", [obj retainCount]);
propertyWithRetain = obj;
NSLog(@"%d", [obj retainCount]);
// output:
// 1
// 1
如何创建一个真正保留对象的属性?
答案 0 :(得分:5)
你没有在那里使用你的财产,这就是为什么它没有保留!
试试这个:
id obj = getObjectSomehow();
NSLog(@"%d", [obj retainCount]);
self.propertyWithRetain = obj; // Note the self. :)
NSLog(@"%d", [obj retainCount]);
使用self.
将使用该属性。只使用变量名称不会。
特别为@bbum编辑(他在评论中提出了非常公平的观点)
不要依赖使用retainCount - 你不知道还有什么保留了你的对象而你不知道其中一些保留是否实际上是预定的自动释放因此它通常是一个误导性的数字:)
答案 1 :(得分:2)
propertyWithRetain = obj;
这只是将ivar直接设置为属性。合成@property时,如果没有声明实例变量,则会自动生成一个。以上是直接使用那个ivar。
self.propertyWithRetain = obj;
这实际上会通过@synthesize
d setter并碰撞保留计数。
这也是为什么我们中的许多人使用@synthesize propertyWithRetain = propertyWithRetain_;
来使iVar的命名方式不同。
请注意,即使在此,调用retainCount
也可能会产生误导。尝试使用[NSNumber numberWithInt: 2];
或常量字符串。真的,不要打电话给retainCount
。永远不会。