-1

我的 .h 文件中有这个:

@property (nonatomic,retain) CCTexture2D *tempScreenshot;

因为它说“保留”,所以我假设存储的任何值都tempScreenshot被保留。

我必须tempScreenshot在我的班级的 dealloc 方法中释放吗?

另外,如果我使用该set方法为 赋予一个新值tempScreenshot,这个新值将被保留,对吗?值会发生什么变化old

4

3 回答 3

1

关键字将retain属性标记为在赋值时保留,这意味着在集合上,retain将在新值上调用,并将 release在旧值上调用。

您将需要release将对象放在dealloc.

于 2012-07-19T17:20:33.207 回答
1

既然您说“保留”,我假设这是手动内存管理代码。如果可能,您应该切换到自动引用计数 (ARC)。它极大地简化了这项工作,并且比等效的手动代码更快。除了支持旧操作系统之外,几乎没有理由再进行手动内存管理了。

由于它说“保留”,我假设存储在 tempScreenshot 中的任何值都被保留。

每当您调用[self setTempScreenshot:]时,访问器都会保留参数并释放旧值。直接分配 ivar 不会给您任何这些。除了 init 和 dealloc 之外,您应该始终使用访问器。

我必须在班级的 dealloc 方法中释放 tempScreenshot 吗?

是的。

另外,如果我使用 set 方法给 tempScreenshot 一个新值,这个新值将被保留,对吗?旧值会发生什么变化?

只要您使用访问器,它将被释放。

于 2012-07-19T17:20:38.020 回答
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];
}

使用合成的方法要干净得多,但是这样看可能会消除任何混乱。

于 2012-07-19T17:23:05.023 回答