2012-07-19 152 views
-1

我有这个在我的.h文件/释放:关于保留的属性

@property (nonatomic,retain) CCTexture2D *tempScreenshot; 

因为它说:“保留”,我假设任何值存储在tempScreenshot被保留。

我需要在我的课的dealloc方法中发布tempScreenshot吗?

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

+0

纯粹出于好奇,你怎么没有使用ARC? – 2012-07-19 17:20:44

+0

@KarolyS:我使用的是cocos2d-iphone,我发现文档将我的游戏转换为ARC有点混乱。但我不介意:手动的东西无论如何都不会给我带来太多麻烦。另外,我希望在尝试更改为自动之前更好地理解手动方式。 – Voldemort 2012-07-19 17:22:50

+0

啊,我可以理解不想转换(我相信甚至可能有工具)已经建成的游戏。我强烈推荐和未来的项目使用它,它非常有用,并且相当简化了内存管理! – 2012-07-19 17:25:16

回答

1

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

既然它说“保留”,我假设无论存储在tempScreenshot中的值是否保留。

每当您拨打[self setTempScreenshot:]时,存取器将保留该参数并释放旧值。直接分配伊娃不会给你任何这个。你应该总是使用访问器,除了init和dealloc。

我是否必须在我的类的dealloc方法中释放tempScreenshot?

是的。

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

只要您使用存取器,它就会被释放。

1

retain关键字标记属性作为保留在分配,这意味着在一组,retain将呼吁新的价值,release将在旧的值被调用。

您需要release上的对象dealloc

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]; 
} 

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