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