我有这个在我的.h文件/释放:关于保留的属性
@property (nonatomic,retain) CCTexture2D *tempScreenshot;
因为它说:“保留”,我假设任何值存储在tempScreenshot
被保留。
我需要在我的课的dealloc方法中发布tempScreenshot
吗?
此外,如果我使用set
方法为tempScreenshot
赋予新值,这个新值将被保留,对吗? old
值会发生什么变化?
我有这个在我的.h文件/释放:关于保留的属性
@property (nonatomic,retain) CCTexture2D *tempScreenshot;
因为它说:“保留”,我假设任何值存储在tempScreenshot
被保留。
我需要在我的课的dealloc方法中发布tempScreenshot
吗?
此外,如果我使用set
方法为tempScreenshot
赋予新值,这个新值将被保留,对吗? old
值会发生什么变化?
既然你说“保留”我假设这是手动内存管理代码。如果可能的话,你应该切换到自动参考计数(ARC)。它极大地简化了这项工作,并且比等效的手动代码更快。除了支持较旧的操作系统,几乎没有理由再进行手动内存管理。
既然它说“保留”,我假设无论存储在tempScreenshot中的值是否保留。
每当您拨打[self setTempScreenshot:]
时,存取器将保留该参数并释放旧值。直接分配伊娃不会给你任何这个。你应该总是使用访问器,除了init和dealloc。
我是否必须在我的类的dealloc方法中释放tempScreenshot?
是的。
此外,如果我使用set方法给tempScreenshot一个新值,这个新值将被保留,对吗?旧价值会发生什么变化?
只要您使用存取器,它就会被释放。
的retain
关键字标记属性作为保留在分配,这意味着在一组,retain
将呼吁新的价值,和release
将在旧的值被调用。
您需要release
上的对象dealloc
。
在你的dealloc方法中,执行:self.tempScreenshot = nil; 这将导致对象被释放。假定没有其他东西保留它,它将被解除分配。
如果您要编写自己的setter方法来保留一个对象,它看起来像这样。
//Assume an instance variabled name obj for this example
- (void)setAndRetainObjectExample:(NSObject *)newObj {
[obj release];
obj = newObj;
[obj retain];
}
使用合成的方法更清洁,但以这种方式查看可能会消除任何混淆。
纯粹出于好奇,你怎么没有使用ARC? – 2012-07-19 17:20:44
@KarolyS:我使用的是cocos2d-iphone,我发现文档将我的游戏转换为ARC有点混乱。但我不介意:手动的东西无论如何都不会给我带来太多麻烦。另外,我希望在尝试更改为自动之前更好地理解手动方式。 – Voldemort 2012-07-19 17:22:50
啊,我可以理解不想转换(我相信甚至可能有工具)已经建成的游戏。我强烈推荐和未来的项目使用它,它非常有用,并且相当简化了内存管理! – 2012-07-19 17:25:16