簡體   English   中英

與目標C一起保留

[英]retain with objective-c

我有一個關於保留和NSString的問題,如果我有一個返回NSString的方法,並且將返回NSString放在nsstring變量中,我是否必須保留?

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

有關內存管理Apple開發人員文檔介紹了保留/釋放對象的方案。

簡而言之,如果您想讓弦線纏住,則需要保留它,直到完成為止。 如果那僅僅是當前函數的范圍,那么您可以不保留它而逃脫,就好像字符串已經被自動釋放(可能)直到函數完成並且清除了當前的AutoReleasePool才會釋放它一樣。

請記住,NSString *實際上可能指向NSMutableString *。 如果在您NSString * myCopyOfString = [mystring copy];通過其他函數更改了字符串對您來說很重要,請確保將其復制: NSString * myCopyOfString = [mystring copy];

如果字符串設置為自動釋放(很可能是這樣),則是的,您將需要以某種方式保留它。 我建議這樣做:

myString = [[self methodWhoReturnString] copy];

這樣可以確保您保留了字符串中的數據,而不僅僅是保留對字符串的引用,而該字符串可能仍會在其他位置進行控制。 確保稍后再發布副本!

任何具有allocnewcopy的方法都會自動保留並推斷您對該對象擁有所有權。 所有其他人都不應該。 但是,如果您有更多的背景信息,將很有幫助。 如果我們在一個包含的方法中簡短地使用了此字符串,那么您可能不需要保留。 如果要使用一段時間,則可能需要使用@synthesize語法使其成為您所在類的屬性。當使用@property@synthesize並調用諸如self.myProperty = something ,將自動保留。

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

因此,如果methodWhoReturnString是您的方法,我相信為了遵守約定,您應該return [stringToReturn autorelease]; 從該方法,然后保留它(如果要保留它)。

如果要在以后的某個時間點(即返回當前方法之后)使用myString來防止其自動釋放,則可以使用retain

如果僅僅是在當前方法中使用的臨時變量,則不需要使用retain ,因為在這種情況下,您確實希望將其自動釋放。

一種特殊情況是屬性。 如果調用self.blah = foo ,則不需要保留foo,因為setBlah:方法應該為您完成此操作。

(還有很多其他復雜性和邊緣情況,但這是一個很好的經驗法則,可以幫助您開始了解如何做)

給定您提供的代碼,您不應調用-retain 在您的示例中,將返回NSString實例的方法的返回值分配給自動局部變量myString 如果已對實例變量或靜態變量進行了分配,則可能需要調用retaincopy來確保引用在局部作用域之外仍然有效。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM