2012-07-19 148 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]; 
} 

使用合成的方法更清潔,但以這種方式查看可能會消除任何混淆。