我对块和ARC的理解存在差距,我希望得到一些帮助。我收到了一个源自动画完成块的测试器的崩溃报告。碰撞如下:在ARC下的块中声明的对象的生命周期是多少?
异常类型:EXC_BAD_ACCESS(SIGSEGV)
异常代码:KERN_INVALID_ADDRESS在0xf0000010
这是以下的动画完成块内发生(使用animateWithDuration:animations:completion:
)。我使用的临时变量交换两个视图控制器:
{
[current wasMovedOffScreen];
PlayerViewController *temp = current;
current = next;
next = temp;
}
next = temp;
是其上发生崩溃的行。动画的持续时间是0.3秒。
此代码在视图控制器内部执行,该视图控制器充当两个其他视图控制器的容器,用于模拟用户通过列表中的对象,如导航控制器,但具有一些定制控制器不适合我。
这两个子视图控制器被称为“当前”和“下一个” - 您可以猜到当前控制器显示当前内容,并且当用户在列表中移动时,下一个用于在新项目中设置动画。
如果我更改块以便在执行中声明temp
(与current
和next
一起),崩溃停止。然而,我不需要为一个本地和临时定义的东西举办一个阶级ivar。
所以,
- 为什么
temp
显然是由ARC在此过程中释放? - 执行此操作的正确方法是什么?是否有一些生命周期限定符应添加到块实施中?
- 为什么我不能在自己的设备或模拟器上重现崩溃?这两款设备都是iPhone 4运行相同版本的iOS(5.0.1)。
没有贝塔斯参与,缺乏repro真的很烦我! – jrturton 2012-01-15 15:15:44