手动保留ARC

Ale*_*der 24 memory-management objective-c ios ios5 automatic-ref-counting

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

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

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

- (void)stopAsyncWork
{
    [_delegate release];
}
Run Code Online (Sandbox Code Playgroud)

ARC的这种模式相当于什么?

Mag*_*eth 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
Run Code Online (Sandbox Code Playgroud)

这可以通过使用__bridge_retained和__bridge_transfer来转换内容(void*)来导致事物被保留,或者在不调用retain的情况下创建强引用.

玩得开心,但要小心!

  • 这是我保持编译器不会生成有关未使用变量的警告的方法. (2认同)

Jer*_*myP 10

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

或者有一个局部变量 executeAsyncWork

- (void)executeAsyncWork
{
    id localCopy = _delegate;

    if (localCopy != nil) // since this method is async, the delegate might have gone
    {
        // do work on local copy
    }
}
Run Code Online (Sandbox Code Playgroud)