我有這個在我的.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