在ARC下安全地将对象作为不透明的上下文参数传递

Ben*_*tto 5 cocoa ios automatic-ref-counting

在手动内存管理下,我经常使用这种模式:

NSString * myStr = /* some local object */
[UIView beginAnimation:@"foo" context:(void *)[myStr retain]];
Run Code Online (Sandbox Code Playgroud)

然后,后来和异步:

- (void)animationDidStop:(NSString *)anim finished:(NSNumber *)num context:(void *)context
{
    NSString * contextStr = (NSString *)context;
    // ...
    [contextStr release];
}
Run Code Online (Sandbox Code Playgroud)

即我手动管理用作不透明上下文的对象的生命周期.(对于旧的UIView动画也是如此,但对于我使用的其他类型的API也是如此.)

在ARC下,我的直觉是我想要__bridge_retained进入和__bridge_transfer处理程序,如此处所示.但是这会将Cocoa对象视为CFType不是因为它实际上是桥接的,而只是为了将一个保留在其喉咙上.

这是否有效,这在风格上是否可以接受?如果没有,那么什么是更好的*解决方案?

(这个问题中接受的答案给出了一个不同的答案,说__bridge单独是可以的,但在我看来这是错误的,因为原始字符串一旦超出第一个函数的范围就有被释放的风险. 对?)

*请不要说"使用基于块的动画".(那不是我要问的.)

CRD*_*CRD 2

跟随你的直觉。__bridge_retained将对象的管理从 ARC 转移给您,而__bridge_transfer相反,不必担心将对象视为CFType- 您实际上并没有这样做,只是接管管理。

您看到推荐的另一种方法是构建代码,以便 ARC 保留管理权,但这很容易被认为是人为的(并且变得混乱)。让您正在使用的 API 保持其设计目的的值是干净的;只需适当地注释代码,其中管理将交给 API 并返回给 ARC。