在手动内存管理下,我经常使用这种模式:
NSString * myStr = /* some local object */
[UIView beginAnimation:@"foo" context:(void *)[myStr retain]];
然后,稍后异步:
- (void)animationDidStop:(NSString *)anim finished:(NSNumber *)num context:(void *)context
{
NSString * contextStr = (NSString *)context;
// ...
[contextStr release];
}
即我手动管理用作不透明上下文的对象的生命周期。(这适用于旧的 UIView 动画,但也适用于我使用的其他类型的 API。)
在 ARC 下,我的直觉是我想__bridge_retained
进入__bridge_transfer
处理程序,正如这里所建议的那样。但这将 Cocoa 对象视为CFType
不是因为它真的被桥接了,而只是为了将保留物塞进它的喉咙。
这是有效的,这在风格上是否可以接受?如果没有,更好的*解决方案是什么?
(这个问题中接受的答案给出了一个不同的答案,说__bridge
单独是可以的,但在我看来这是错误的,因为原始字符串一旦超出第一个函数的范围就有被释放的风险。 对?)
*请不要说“改用基于块的动画”。(这不是我要问的。)