我在.h文件中有这个:
@property (nonatomic,retain) CCTexture2D *tempScreenshot;
由于它表示“保留”,我假设保留tempScreenshot
中存储的任何值。
我是否必须在班级的dealloc方法中发布tempScreenshot
?
另外,如果我使用set
方法为tempScreenshot
提供新值,则会保留此新值,对吧? old
值会发生什么变化?
答案 0 :(得分:1)
retain
关键字将属性标记为在分配时保留,这意味着在一个集合上,retain
将在新值和上调用将在旧值上调用strong> release
。
您需要release
dealloc
上的{{1}}对象。
答案 1 :(得分:1)
因为你说“保留”我假设这是手动内存管理代码。如果可能的话,您应该切换到自动参考计数(ARC)。它大大简化了这项工作,并且比同等的手动代码更快。除了支持旧操作系统之外,几乎没有理由再进行手动内存管理了。
由于它表示“保留”,我假设保留了tempScreenshot中存储的任何值。
每当您致电[self setTempScreenshot:]
时,访问者都会保留参数并释放旧值。直接分配ivar不会给你任何这些。除了init和dealloc之外,你应该总是使用访问器。
我是否必须在我班级的dealloc方法中发布tempScreenshot?
是
另外,如果我使用set方法为tempScreenshot提供一个新值,那么这个新值将被保留,对吧?旧价值会发生什么变化?
只要您使用访问者,它就会被释放。
答案 2 :(得分:1)
在你的dealloc方法中,执行:self.tempScreenshot = nil; 这将导致对象被释放。然后,假设没有其他任何东西保留它,它将被解除分配。
如果您要编写自己的setter方法来保留对象,它将看起来像这样。
//Assume an instance variabled name obj for this example
- (void)setAndRetainObjectExample:(NSObject *)newObj {
[obj release];
obj = newObj;
[obj retain];
}
使用合成的方法更清晰,但以这种方式查看可能会消除任何混淆。