gpt4 book ai didi

objective-c - 在 ARC 下的 block 中声明的对象的生命周期是多少?

转载 作者:行者123 更新时间:2023-11-29 13:41:52 24 4
gpt4 key购买 nike

我对 block 和 ARC 的理解存在差距,我希望得到一些帮助。我收到了来自测试人员的崩溃报告,该报告来自动画完成 block 。崩溃如下:

Exception Type: EXC_BAD_ACCESS (SIGSEGV)

Exception Codes: KERN_INVALID_ADDRESS at 0xf0000010

这发生在以下动画完成 block 中(使用 animateWithDuration:animations:completion:)。我正在使用临时变量交换两个 View Controller :

{
[current wasMovedOffScreen];
PlayerViewController *temp = current;
current = next;
next = temp;
}

next = temp; 是发生崩溃的行。动画持续时间为 0.3 秒。

此代码在 View Controller 内执行,该 View Controller 充当其他两个 View Controller 的容器,用于模拟用户通过对象列表,如导航 Controller ,但有许多自定义意味着导航 Controller 不适合我。

这两个 subview Controller 称为“current”和“next”——您可以猜到当前 Controller 显示当前内容,下一个用于在用户在列表中移动时在新项目中设置动画。

如果我更改 block 以便在实现中声明 temp(连同 currentnext),崩溃将停止。然而,我似乎没有必要为定义为本地和临时的东西保留一个类 ivar。

所以,

  • 为什么 temp 显然在这个过程中被 ARC 释放了?
  • 实现它的正确方法是什么?我应该向 block 实现中添加一些生命周期限定符吗?
  • 为什么我无法在自己的设备或模拟器中重现崩溃?这两款设备都是运行相同版本 iOS (5.0.1) 的 iPhone 4。

最佳答案

在这种情况下,我认为问题实际上不是 ARC。变量(包括局部变量)默认是__strong,所以第一次赋值时应该保留current

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html - 请参阅“变量限定符”部分

如果您遇到无法重现的崩溃,那么它总是很难修复。您是否尝试过在调试器之外运行该应用程序?加载调试器有时会改变行为。另外,尝试使用 NSZombieEnabled 或 Instruments.app 的僵尸工具进行调试。

关于objective-c - 在 ARC 下的 block 中声明的对象的生命周期是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8870114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com