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的情况下创建强引用.
玩得开心,但要小心!
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)