关于属性的保留/释放

时间:2012-07-19 17:15:52

标签: objective-c

我在.h文件中有这个:

@property (nonatomic,retain) CCTexture2D *tempScreenshot;

由于它表示“保留”,我假设保留tempScreenshot中存储的任何值。

我是否必须在班级的dealloc方法中发布tempScreenshot

另外,如果我使用set方法为tempScreenshot提供新值,则会保留此新值,对吧? old值会发生什么变化?

3 个答案:

答案 0 :(得分:1)

retain关键字将属性标记为在分配时保留,这意味着在一个集合上,retain将在新值 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];
}

使用合成的方法更清晰,但以这种方式查看可能会消除任何混淆。