24

挽留ARC之前,我有下面的代碼保留委託,同時異步操作正在進行:手冊與ARC

- (void)startAsyncWork 
{ 
    [_delegate retain]; 
    // calls executeAsyncWork asynchronously 
} 

- (void)executeAsyncWork 
{ 
    // when finished, calls stopAsyncWork 
} 

- (void)stopAsyncWork 
{ 
    [_delegate release]; 
} 

什麼是等同於這種模式與ARC?

回答

10

爲什麼不只是在異步任務的持續時間內將委託對象分配給強大的ivar?

或者在executeAsyncWork

​​
+0

謝謝。那也是我的第一個想法。我希望會有另一個巧妙的技巧;-)。 – Alexander

+0

有,使用GCD! ;-) – hypercrypt

+0

@hypercrypt:GCD不是讓變量懸而未決的解決方案,但它是實際執行異步工作的一種非常好的方法。 – JeremyP

3

像這樣一個局部變量:

我偶爾會需要

- (void)startAsyncWork 
{ 
    id<YourProtocol> delegate = _delegate; 
    dispatch_async(/* some queue */, ^{ 
     // do work 
     [delegate doSomething]; 
    } 
} 
塊,只要需要將保留委託...

31

手動保留和釋放東西(有時僅用於調試)並提出以下宏:

#define AntiARCRetain(...) void *retainedThing = (__bridge_retained void *)__VA_ARGS__; retainedThing = retainedThing 
#define AntiARCRelease(...) void *retainedThing = (__bridge void *) __VA_ARGS__; id unretainedThing = (__bridge_transfer id)retainedThing; unretainedThing = nil 

這個工作原理是通過使用__bridge_retained和__bridge_transfer將事物從(void *)轉換到或導出,從而保留事物,或者在不調用retain的情況下創建強引用。

玩得開心,但要小心!

+1

用於將Arc關鍵字變成英語單詞的+1 –

+0

非常酷 - 謝謝! – Anthony

+0

第一個宏的這部分原因是什麼:'remainingThing = retainedThing'? – Anthony