2013-05-01 127 views
0

我正在使用ARC,並且我知道autoreleasepool向其中的所有元素髮送發佈。考慮下面的例子。@autoreleasepool做什麼?

-(NSString*)someMethod{ 

    NSString *[email protected]"sample text inside string 1"; // string1 add to main autorelease pool 
    NSString *string2=[[NSString alloc] init];  // string2 retain count is 1 

    [email protected]"sample text inside string 2";   // just assigning 

    return string1; 

} 

-(void)viewDidLoad{ 

    NSString *returnedString=[self someMethod]; 

} 

1.我的問題是我如何完全 的someMethod釋放字符串2?

2.如何從viewDidLoad方法中完全釋放string1?

注:我使用ARC

,如果我使用的someMethod @autoreleasepool那麼我認爲這會破壞雙方字符串1和字符串。不會嗎?

又會有怎樣使用@autoreleasepool的效果的someMethod

-(NSString*)someMethod{ 

    @autoreleasepool{ 

    NSString *[email protected]"sample text inside string 1"; // string1 add to main autorelease pool 
    NSString *string2=[[NSString alloc] init];  // string2 retain count is 1 

    [email protected]"sample text inside string 2";   // just assigning 

    } 
    return string1; 

} 
+1

值得注意的是,在所有這樣的數百個問題出現之後,沒有有用的例子可以使用文字字符串來完成。它們是編譯時常量,因此不會被標準內存管理處理。 – jrturton 2013-05-01 11:01:16

+0

[Objective-C:爲什麼autorelease(@autoreleasepool)仍然需要使用ARC?](http://stackoverflow.com/questions/9086913/objective-c-why-is-autorelease-autoreleasepool-still-needed -with-arc) – Igor 2017-01-24 13:01:23

回答

2

首先,

NSString *string2=[[NSString alloc] init]; 
[email protected]"sample text inside string 2"; 

字符串2是不是對象本身。它是一個指向對象的指針。所以在這裏你創建一個對象,獲取一個指針,然後立即用一個指向另一個字符串的指針替換它。如果你沒有使用ARC,你會在這裏泄漏內存。看看@Anoop Vaidya的回答,瞭解更多細節。

至於你的問題:當你使用ARC時,編譯器自動跟蹤對象並在不再使用時釋放它們。所以你不必手動發佈它。你可以指定一個指向零的指針,但只要我記得它沒有必要。

第二個示例中的代碼將不會編譯,因爲string1是在autorelease範圍內聲明的。實際上這個@autorelease在這裏沒有什麼區別,因爲你不會在裏面創建自動釋放對象。

This question包含有關在ARC中使用autorelease池的更多詳細信息。 蘋果的官方文檔可能是我見過的最好的,所以請隨時看看their Advanced memory management programming guide。它不是太長,它詳細解釋了一切:)

+1

在該示例中'string2'的保留計數不是1。 – bbum 2013-05-01 13:43:58

+0

我複製了這段代碼的問題,並沒有修改評論。但爲什麼不是1?如果我們在沒有ARC的情況下使用[[NSString alloc] init],我們會得到一個帶有retainCount == 1的字符串。ARC會改變這種行爲嗎?由於評論位於第一行,因此我正在討論第一行代碼。現在我將刪除代碼中的評論。無論如何感謝你幫助找到真相:) – FreeNickname 2013-05-01 16:59:24

+1

它與ARC無關。這完全是一個內部實現細節,並且指示了「retainCount」是多麼的無用。 '[[NSString alloc] init]'返回一個保留數爲'UINT_MAX'的單例。你可以 - 也應該 - 考慮保留計數是'+ 1'(一個+1的增量),你需要用'release'來平衡它,但絕對保留計數的值是無用的。 – bbum 2013-05-01 17:02:10

0
NSString *string2=[[NSString alloc] init];  // string2 retain count is 1 
[email protected]"sample text inside string 2"; 

路不好做。

而是做這樣

NSString *string2=[[NSString alloc] initWithString:@"sample text inside string 2"]; 

甚至

NSString *[email protected]"sample text inside string 2"; 

string1autorelease d模式下,你沒有將它釋放。

正如您使用的是ARC(Automatic Reference Counting)。你永遠不會釋放對象。編譯器會照顧它。

+0

那麼string1怎麼釋放呢? – 2013-05-01 09:25:27

+0

@MuhammadNasir:我寫道,你不需要釋放它,這是在autorelease模式。它將在autorelease池的末尾發佈。 – 2013-05-01 09:28:33

+0

@MuhammadNasir:哪個字符串? – 2013-05-01 09:28:57

0

你不需要釋放它,它會自動完成ARC。 如果您在使用ARC時嘗試釋放任何對象,它會發出錯誤。

+0

我知道當游泳池排水時會照顧它。我的問題是我如何立即發佈它。例如我想用相同的方法釋放string2。那麼我該怎麼做 – 2013-05-01 09:38:16

2

如果您使用ARC,則無法釋放任何對象。當你使用ARC時,它由編譯器自己處理。

所以,連字符串也會以同樣的方式發佈。

+0

如果我使用string2 = nil;在someMethod然後在viewDidload中設置returnedString = nil;那會工作嗎? – 2013-05-01 09:32:52