【发布时间】:2012-10-09 22:05:16
【问题描述】:
在手动内存管理下,我经常使用这种模式:
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 在处理程序中,as suggested here。但这将 Cocoa 对象视为 CFType 并不是因为它真的被桥接了,而只是为了将保留物塞进它的喉咙。
这是有效的吗?这在风格上是否可以接受?如果没有,更好的*解决方案是什么?
(接受的答案in this question 给出了不同的答案,说单独__bridge 是可以的,但在我看来这是错误的,因为原始字符串一旦发出就会有被释放的风险第一个函数的作用域。对吧?)
*请不要说“改用基于块的动画”。 (这不是我要问的。)
【问题讨论】:
-
以
void*上下文对象的形式传递保留对象一开始就非常难看。如果你真的需要这样做,我不会担心它是否“在风格上可以接受”。
标签: ios cocoa automatic-ref-counting