2

我需要知道我是否正確。應用程序運行正常,但我不確定我是否正確地獲取生命週期(泄漏?)。塊和ARC的內存管理,泄漏?

注意:儀器看不到泄漏。

的方法AAA級代碼:一些A級:

- (void) aaa { 
    NSString *path = ...something...; 

    NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{ 
    // using path 
    [self somethingElseWith:path]; 
    }]; 

    [self.aQueue addOperation:theOp]; 
} 

所以我創建了一個塊穿上aQueue(NSOperationQueue *)。目標是從主線程卸載長時間運行的somethingElseWith:方法,以便GUI繼續響應。

塊內我引用了將在aaa:方法結束時超出範圍的本地var「路徑」。

如果我正確讀取了文檔,該塊將在'路徑'上執行保留。但是ARC是否會隱式地在這個塊的末尾插入一個版本?將是合乎邏輯的,很好。

或者我應該聲明'path'爲__block並將其分配給nil在我的塊的結尾? (手動...)

不知道我明白如何在這種情況下使用__weak。

回答

6

中描述了path變量是好的。但是,您可能需要通過使用參考selfweak來避免保留週期。如果aQueuestrong參考,那麼可能會有一個保留週期導致self永遠不會被釋放。

解決方案:

- (void) aaa { 
    NSString *path = ...something...; 

    __weak id self_ = self; 
    NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{ 
    // using path 
    [self_ somethingElseWith:path]; 
    }]; 

    [self.aQueue addOperation:theOp]; 
} 

確保操作不會被調用後,類應該不再存在。

+0

謝謝。問題:如果沒有使用ARC,那麼'path'變量是否也可以?或者在塊的末尾需要'[path release]'? – malaba 2012-02-23 10:12:07

+0

@malaba在有或沒有ARC的情況下,路徑變量都很好,因爲塊會爲你保留路徑並在塊被釋放/超出範圍時釋放它。 – Joe 2012-02-23 14:08:15

3

該塊將自動處理來自封閉範圍的任何本地人的內存管理。在這種情況下,您不必擔心保留/釋放對。請注意,雖然path將在塊的範圍內爲const。如果您需要path在塊內可變,請使用__block屬性。

的不同方式的塊處理變量詳細here: Blocks and Variables