2012-05-01 31 views
1

我新的Objective-C和我不知道如果我使用NSAutoreleasePool的正確途徑。這是使用NSAutoreleasePool的正確方法嗎?

  1. 如果我想使用自動釋放唯一一次我用:

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSString *newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool release]; //newText will be released 
    
  2. 如果我想使用自動釋放幾次我用:

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSString *newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool drain]; //newText will be released 
    newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool drain]; //newText will be released 
    newText = [NSString stringWithFormat:@"%d", prograssAsInt]; 
    sliderLabel.text = newText; 
    [pool release]; //newText will be released 
    

這是好?有沒有內存泄漏?

回答

3

( 2)不好。 -drain-release是等價的(在參考計數環境),以及aftering -drain荷蘭國際集團的自動釋放池被解除分配。所以你將雙釋放autorelease池對象並使程序崩潰。

即使在ARC之前,除非您的內存預算非常緊張,否則除了樣板main()之外,創建NSAutoreleasePool並不常見。 -autoreleaseÐ入池的對象將NSRunLoop的每一個滴答聲後,反正被釋放。如果嚴格遵守所有權轉移規則,則不會發生內存泄漏(請參閱Understanding reference counting with Cocoa and Objective-C)。

而且 ARC打開,您甚至不需要關心這個 - 編譯器將插入-retain-release在適合你的地方。


而且,如果sliderLabel.text被標記爲@property(retain)(或(strong)),然後釋放自動釋放池(1)將不發佈使用newText,因爲這個對象現在有一個新的所有者。

3

我要說[pool drain]的調用是不必要的。我從來沒有見過他們在實踐中使用。我想如果你在autorelease池中分配大量的內存,它可能是必要的。但在典型的情況下,我想不會。

你將要開始使用下面的結構,順便說一下,對於自動釋放池:

@autoreleasepool { 
    ... your code ... 
} 

這,顯然遠遠超過了「老」的方式(你正在做的方式高效)。在功能上,它是一樣的,但內部表現要好得多。最近Xcode/iOS發行說明中提到了這個問題。

3

抱歉這樣說,但RTFM。在調用-drain之後,池將自行釋放,以使其無效。

而且,目前,在Objective-C與蘋果的LLVM編譯器,有一個名爲@autoreleasepool語言此外,隨着雙方ARC和非ARC代碼的工作,你可以利用這樣:

@autoreleasepool { 
    // code that will automatically have any -autoreleased variables cleaned up. 
} 
+0

我覺得無禮是沒有道理的。雖然這是記錄在案,這是非常違反直覺的,到了那裏我從有經驗的程序員可可究竟是誰閱讀文檔,並沒有認爲它的意思是說,聽到了點。我不認爲對於剛接觸這個框架的人來說這是一個不合理的問題。 – Chuck

3

通常情況下,如果你是在主線程和你不使用的資源密集型代碼一個巨大的循環,你永遠不要需要創建自己的自動釋放池。只需使用爲您創建的默認設置即可。

你只需要,如果你的多線程使自己或者如果你正在做一個內存密集型長期運行的循環(這你可能不應該在主線程上做反正)。

相關問題