我的 .h 文件中有这个:
@property (nonatomic,retain) CCTexture2D *tempScreenshot;
因为它说“保留”,所以我假设存储的任何值都tempScreenshot
被保留。
我必须tempScreenshot
在我的班级的 dealloc 方法中释放吗?
另外,如果我使用该set
方法为 赋予一个新值tempScreenshot
,这个新值将被保留,对吗?值会发生什么变化old
?
我的 .h 文件中有这个:
@property (nonatomic,retain) CCTexture2D *tempScreenshot;
因为它说“保留”,所以我假设存储的任何值都tempScreenshot
被保留。
我必须tempScreenshot
在我的班级的 dealloc 方法中释放吗?
另外,如果我使用该set
方法为 赋予一个新值tempScreenshot
,这个新值将被保留,对吗?值会发生什么变化old
?
关键字将retain
属性标记为在赋值时保留,这意味着在集合上,retain
将在新值上调用,并将 release
在旧值上调用。
您将需要release
将对象放在dealloc
.
既然您说“保留”,我假设这是手动内存管理代码。如果可能,您应该切换到自动引用计数 (ARC)。它极大地简化了这项工作,并且比等效的手动代码更快。除了支持旧操作系统之外,几乎没有理由再进行手动内存管理了。
由于它说“保留”,我假设存储在 tempScreenshot 中的任何值都被保留。
每当您调用[self setTempScreenshot:]
时,访问器都会保留参数并释放旧值。直接分配 ivar 不会给您任何这些。除了 init 和 dealloc 之外,您应该始终使用访问器。
我必须在班级的 dealloc 方法中释放 tempScreenshot 吗?
是的。
另外,如果我使用 set 方法给 tempScreenshot 一个新值,这个新值将被保留,对吗?旧值会发生什么变化?
只要您使用访问器,它将被释放。
在您的 dealloc 方法中,执行: self.tempScreenshot = nil; 这将导致对象被释放。假设没有其他东西保留它,它将被释放。
如果您要编写自己的 setter 方法来保留对象,它将如下所示。
//Assume an instance variabled name obj for this example
- (void)setAndRetainObjectExample:(NSObject *)newObj {
[obj release];
obj = newObj;
[obj retain];
}
使用合成的方法要干净得多,但是这样看可能会消除任何混乱。