2011-05-31 62 views
0
-(NSString *)returnString 
{ 
     NSString *str=[NSString new]; 
     return str; 
} 

-(void)getString { 
    NSString *string=[self returnString]; 
    [string release]; 
} 

這是釋放NSString的適當/正確方法嗎?以物鏡c釋放物體的正確方法

另外,如果自動釋放對象的生命週期在runloop結束時啓動。那麼我們可以手動排除系統生成的自動釋放池嗎?所以我可以釋放所有的自動釋放對象,我得到一個內存警告。

+0

我完全不清楚你想要用你的代碼片段做什麼或者你在問什麼。爲什麼你會有一個函數只是創建一個新的對象,並返回它未初始化? – 2011-05-31 04:13:04

+0

我正在做一個巨大的項目,並且在項目的某些部分有些對象正在返回到調用函數而沒有釋放它。所以我可以在我們得到字符串的位置釋放它。 – 2011-05-31 04:16:37

+0

使用'autorelease'。 – 2011-05-31 04:19:48

回答

6

您應該創建一個具有自動釋放功能的對象。 試試這個

-(NSString *)returnString 
    { 
    NSString *str= [[NSString new] autorelease]; 
    return str; 
    } 
+1

Ganesh是正確的。每次你在內存中分配一個新的對象,但不能明確地釋放它,因爲你已經將這個對象返回給另一個函數,或者「別人」現在擁有這個對象,你應該總是使用autorelease。 – 2011-05-31 04:14:26

+0

您可以將上述內容合併爲一行,但基本前提是正確的。 – csano 2011-05-31 04:21:03

0

你絕對可以手動清空池。每次你消耗一個池,你都會間接地發送release到這個池中的所有分配的對象。

雖然請記住,在某些特定情況下,您應該只使用Autorelease。例如,您不應該一直使用它來避免擔心手動釋放對象。

就個人而言,我並不完全信任Autorelease,但是當您將對象的所有權歸給其他人時,這是您唯一的選擇。對於任何你仍然擁有它並且可以手動釋放它的地方,選擇這樣做。

+0

我認爲如果我們正在創建一個nsautorelease池,我們可以將其耗盡。但是如果我們不創建一個自動釋放池,所有的自動釋放對象都會進入系統生成的自動釋放池。這個池將在運行循環結束時耗盡。我的問題是我們可以手動排空這個池。 – 2011-05-31 04:23:01

+0

然後我相信你可以通過簡單地向這個對象發送'release'來從系統的autorelease池中刪除這個對象。因此不必等待運行循環結束才能釋放它。 – 2011-05-31 04:26:44

+0

這是不正確的。向對象發送「釋放」消息不會影響'autorelease'對其執行的操作。如果你這樣做:'[[[MyClass alloc] init] autorelease] release]',當自動釋放池被耗盡並試圖釋放一個已被銷燬的對象時,你的程序會崩潰。 – 2011-05-31 18:48:23