在 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 并直接引用视图。
问题与现有问题部分相似,但我仍然遇到内存管理错误。
以下非 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 并直接引用视图。