我对在ivars分配期间何时使用self关键字感到困惑,当我尝试将某些值分配给ivar或仅在我尝试访问ivar时,是否应该使用它?
此外,如果我在不使用self的情况下在ivar上执行retainCount,它会打印一个计数为1,假设它已经是alloc&在里面。但如果我使用self,它会保留2个。
示例代码:
标题= [[NSMutableDictionary alloc] init];
NSLog(@“转让前的标题:%d”,[标题retainCount]); //打印1
标题=另一个字典; NSLog(@“赋值后的标题:%d”,[标题retainCount]); //打印1
self.Titles = anotherDictionary; NSLog(@“赋值后的标题:%d”,[标题retainCount]); // print 2
我不应该在转让期间使用自己或何时使用?任何帮助都会非常感激,因为这种情况让我很怀疑我的伊娃没有以正确的方式释放。
谢谢, 穆赫辛
编辑:我对上面的问题有另一个相关问题,我应该使用self来分配单例类属性吗?
答案 0 :(得分:1)
当您使用标题= ... 时,您将直接分配给变量。当您使用 self.Titles = ... 时,您实际上正在使用动态生成的setter方法。
顺便说一句,我认为推荐的做法是属性以小写字母开头。对属性及其访问方式进行一些阅读。
答案 1 :(得分:0)
您不使用self来分配ivars或读取它们。您可以使用它来读/写属性,即调用方法/发送消息。
所以在你的例子中:
Titles = anotherDictionary;
在
期间指定了ivar而没有调用setterself.Titles = anotherDictionary;
实际上是
[self setTitles:anotherDictionary];
这通常由@syntetize标题自动生成。
当@property
具有retain
标志时,setter的代码会自动保留对象。
推荐做法: 一旦拥有了负责内存管理的属性,就应该使用它们。而不是手动重置/释放对象。
Here is the apple's guide I was learning from.
<强>更新强>
关于内存管理,只需检查苹果的memory management programming guide它会回答您在评论中提出的问题。它通过示例显示了如何使用属性提供的内存管理。