在 ARC 中使用 "context" 变量开始动画?

beginAnimations with "context"variable in ARC?

问题与现有问题部分相似,但我仍然遇到内存管理错误。

以下非 ARC 代码有效:

[UIView beginAnimations:... context:[[NSNumber numberWithInt:i] retain]];

在 didStopSelector 的某处:

NSNumber * n = (NSNumber *)context;
...
[n release];

我尝试删除 retain/release 并添加副本(并结合这些方式)但没有效果。

另外我看到另一个类似的问题:

UIView Animation on multiple UIImageViews in ARC

他们将 imageName 变量作为 context 传递,但他们没有描述它是保留还是自动释放。

问题:

1)如何将我的代码正确转换为ARC?

2) 如果你传递 retained/autoreleased 上下文(当然,如果自动释放通常会起作用),代码有什么不同吗?

尝试 __bridge_retained 保留对象并将其转换为 void*

void *context = (__bridge_retained void *)( @1000 );

然后在 animationDidStop 中,您必须与 __bridge_transfer 转让所有权。此时ARC应该自然释放当前自动释放池中的对象。

- (void)animationDidStop:(void *)context {
   NSNumber *n = (__bridge_transfer id)context;
}

或者,您可以切换到基于块的 API 并直接引用视图。