用ARC手动保留

在ARC之前,我有以下代码,在asynchronous操作正在进行时保留委托:

- (void)startAsyncWork { [_delegate retain]; // calls executeAsyncWork asynchronously } - (void)executeAsyncWork { // when finished, calls stopAsyncWork } - (void)stopAsyncWork { [_delegate release]; } 

ARC与这种模式有什么相同之处?

为什么不只是在asynchronous任务期间将您的委托对象分配给强大的ivar?

或者在executeAsyncWork有一个局部variables

 - (void)executeAsyncWork { id localCopy = _delegate; if (localCopy != nil) // since this method is async, the delegate might have gone { // do work on local copy } } 

我偶尔需要手动保留和释放东西(有时仅用于debugging),并提出了以下macros:

 #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的情况下创build一个强引用。

玩得开心,但要小心!

像这样的东西:

 - (void)startAsyncWork { id<YourProtocol> delegate = _delegate; dispatch_async(/* some queue */, ^{ // do work [delegate doSomething]; } } 

该块将保留代表只要需要…