2010-11-17 41 views
1

我有一個關於保留和NSString的問題,如果我有一個返回一個NSString的方法,並且將返回的NSString放入一個nsstring變量中,我必須保留或不保留?保留與objective-c

NSString *myString = @""; 
myString = [self methodWhoReturnString]; // I must do this? 
myString = [[self methodWhoReturnString]retain]; // Or I must do this? 
+0

除了答案中的內容之外,如果您實際存儲以供將來使用,則只需保留/複製它。如果你立即使用它,那麼即使是一個自動釋放對象也沒問題。 – Eiko 2010-11-17 15:44:07

回答

5

Apple Developer Documentation on Memory Management解釋了您保留/釋放對象的場景。

簡而言之,如果你想讓字符串四處走動,你需要保留它直到完成它。如果這只是當前函數的範圍,那麼您可以在不保留它的情況下離開,就好像該字符串已經autorelease'd(可能),直到函數完成並清除當前的AutoReleasePool後纔會釋放該字符串。

請記住,NSString *實際上可能指向一個NSMutableString *。如果如果字符串是由一些其他功能,無需你意識到改變其對你很重要,一定要複製:NSString * myCopyOfString = [mystring copy];

0

allocnewcopy中,它會自動保留並推斷你有對象的所有權的任何方法。所有其他人不應該。如果你有更多的上下文,這將是有益的。如果我們在一個簡單使用這個字符串的包含方法中,那麼你可能不需要保留。如果將要使用一段時間,則可能需要使用@synthesize語法使其成爲您所在班級的一個屬性。當您使用@property@synthesize並調用類似self.myProperty = something時,它將自動保留。

+0

這是錯誤的。如果你用'alloc'或'new'創建它,或者如果你用包含'copy'的方法獲得它,或者你保留它'',那麼你擁有這個對象。 'init'對保留計數沒有任何作用。我會投票,但有關創建財產的東西是很好的建議。 – JeremyP 2010-11-17 16:10:32

+0

@JeremyP你是對的。它是alloc,new *和* copy。我混淆了他們。抱歉。 – 2010-11-17 17:01:49

+0

說'self.myProperty = something'會自動調用'-retain'也是不正確的。只有當屬性用'retain'而不是'-copy'或'assign'聲明爲內存管理語義時,纔會出現這種情況。 – jlehr 2010-11-17 17:02:16

1

如果字符串設置爲自動釋放,最有可能的是,那麼您需要以某種方式保留它。我建議這樣做雖然:

myString = [[self methodWhoReturnString] copy]; 

這樣可以保證你的字符串不僅僅是一個可能仍然在其他地方控制的串參考保留數據。請務必在稍後發佈您的副本!

0

通常,methodWhoReturnString將返回一個自動釋放的字符串,這意味着你應該保留它,如果你想保留它周圍。

因此,如果methodWhoReturnString是您的方法,我相信如果您想保留該方法,那麼爲了保持慣例,您應該使用該方法中的return [stringToReturn autorelease];,然後保留它。

0

如果您打算在稍後的時間點(即在當前方法返回後)使用myString以防止自動發佈,則使用retain

如果只是當前方法中使用的臨時變量,則不需要使用retain,因爲在那種情況下,您確實希望它是自動發佈的。

一個特例是屬性。如果您撥打self.blah = foo,則不需要保留foo,因爲setBlah:方法應該爲您做。

(還有其他的複雜性和邊緣情況的整個負載,但這是一個好的經驗法則,讓你開始在理解要做什麼)

0

給你提供的代碼,你不應該叫-retain 。在您的示例中,返回NSString實例的方法的返回值分配給myString,這是一個自動局部變量。如果已經對實例變量或靜態變量進行了賦值,則需要調用retaincopy以確保引用在本地作用域結束後保持有效。

但是,在這種情況下,對NSString實例的引用存儲在一個變量中,該變量將在本地作用域的末尾自動銷燬,因此您的代碼不需要關注對象的生命週期。