0

我知道Obj-C中的塊允許你引用局部變量,這很好。但是我們可以安全地將局部變量從塊內部傳遞給另一個方法嗎?將局部變量作爲塊內的方法參數傳遞是否安全?

我知道引用self可能在塊內部是危險的,但是這會擴展到任何其他變量。

例子:

-(void)methodTakesObject(ObjectA *)object { 

    ObjectB *b = object.b; 
    __weak MyObject *weakSelf = self; 

    [b doInBackground:^(NSArray *results) { 
     [weakSelf doSomethingElseWith:results andWith:object andEvenWith:b]; 
    } 
} 

有三種這裏局部變量的 「類型」。塊中的results,方法內部創建的ObjectB以及傳遞給該方法啓動的ObjectA

我應該關心使用這些變量,實際上沒有任何區別/之間的這些變量是如何從塊

+0

該塊將保持對所有變量的強烈參考。因此,您不應該擔心使用它們。 – user3386109

回答

1

其實內接受治療的擔憂,這都沒有區別,無論涉及哪些變量。

對保留週期的關注是,如果一個對象持有對塊的強烈引用,那麼它將不會被釋放直到它被釋放爲,而該塊擁有對該同一對象的強引用。這不是在這裏發生的。

一個名爲-doInBackground:的方法好像會運行該塊(立即開始 - ish),然後在完成時釋放該塊。所以,只要有其他物體存在,就沒有任何阻擋物存在的可能性,因此沒有希望將其他物體永遠保留下來。

您甚至不需要使用weak-self約定來避免保留週期。你只會在不太可能的情況下使用它,在塊調用它的方法之前,你真的想允許self有時被釋放。更有可能的是,你應該只使用一個普通的,強有力的參考self,因爲這對於self而言足夠長的時間是正常的和/或可取的。

+0

「,然後在完成時釋放塊,所以,只要有其他物體存在,就不會有塊存在,因此沒有希望將其他物體永遠保留。這都是基於名字的猜測。我不會依賴那個。 – newacct

+0

@newacct:示例中的所有名稱都明顯更改爲通用名稱。如果爲該方法選擇的通用名稱未指示其行爲如何,那麼它被選擇得不好。 –

0

如果您擔心保留週期,@ken給你一個完美的答案。至於有關變量的關注:

  1. object是從所謂的 methodTakesObject:,所以你不必擔心它的方法保留。 (如果它不是,tho)。
  2. b也由您保留,引用計數可能是2或者更多,因此您也不必擔心它。

換句話說,你是安全的。

相關問題