ARC 在 Apple 的 UI 库中某处释放了我的对象
ARC releases my object somewhere in Apple's UI library
我有一个局部变量UINavigationConroller *nav
。声明后不到 10 行,在同一方法中,它被传递给 [self presentViewController:nav animated:YES completion:nil]
(self
是 UIViewController
)。我知道在这里传递 nil
是可以的,因为 the documentation says it is.
就在传递之前,一切都很好。但是,当它在其中时,ARC 会取消分配它,并且当 Apple 的 UI 库中的某些东西调用 [UINavigationController isKindOfClass:]
时,应用程序很快就会崩溃,大概是在我的 nav
对象上。这是控制台输出:
2015-03-20 13:33:50.729 Now[9183:3980870] Presenting view controllers on detached view controllers is discouraged <MyViewController: 0x125042200>.
2015-03-20 13:33:50.730 Now[9183:3980870] *** -[UINavigationController isKindOfClass:]: message sent to deallocated instance 0x12601c6e0
几天来,我一直在介入、退出并通过这个 class 和汇编代码,尽可能多地进行谷歌搜索,但似乎无法修复它。我剩下的唯一解决方案是在 presentViewController
之前调用 [nav retain]
,然后立即调用 [nav release]
,但 ARC 禁止这样做。这是一个庞大的旧项目,因此 我们不能关闭 ARC。
如何让 nav
表单在使用完成之前被释放?
更新:
我已经使用 Zombie 分析器对此进行了检查。我发现它确实是一个 UINavigationController
,并且确实在 UIKit:
中被释放
最能说明问题的是前两行,显示分配时从 960B 立即变为 0:
我这看起来很不正常,给我带来了危险信号。
试试这个
[self.view.window.rootViewController presentViewController:navCon animated:YES completion:nil];
如果您反对出于某种原因被释放,请不要依赖它。相反,取决于 window 的根控制器。
已解决。事实证明,当这个代码库第一次被编写时,它使用了一个 "stashing" 系统,它将在一个字段中保存任何模态 UIViewController
然后将其关闭。当再次需要时,它会显示隐藏的模态并nil
验证隐藏变量。
问题出在我处理事情的方式上,我不知道这个系统。在直接呈现或关闭模态时,我无意中设置了一个系统呈现僵尸的情况 UINavigationController
。使用此系统后,它按预期工作。
我有一个局部变量UINavigationConroller *nav
。声明后不到 10 行,在同一方法中,它被传递给 [self presentViewController:nav animated:YES completion:nil]
(self
是 UIViewController
)。我知道在这里传递 nil
是可以的,因为 the documentation says it is.
就在传递之前,一切都很好。但是,当它在其中时,ARC 会取消分配它,并且当 Apple 的 UI 库中的某些东西调用 [UINavigationController isKindOfClass:]
时,应用程序很快就会崩溃,大概是在我的 nav
对象上。这是控制台输出:
2015-03-20 13:33:50.729 Now[9183:3980870] Presenting view controllers on detached view controllers is discouraged <MyViewController: 0x125042200>.
2015-03-20 13:33:50.730 Now[9183:3980870] *** -[UINavigationController isKindOfClass:]: message sent to deallocated instance 0x12601c6e0
几天来,我一直在介入、退出并通过这个 class 和汇编代码,尽可能多地进行谷歌搜索,但似乎无法修复它。我剩下的唯一解决方案是在 presentViewController
之前调用 [nav retain]
,然后立即调用 [nav release]
,但 ARC 禁止这样做。这是一个庞大的旧项目,因此 我们不能关闭 ARC。
如何让 nav
表单在使用完成之前被释放?
更新:
我已经使用 Zombie 分析器对此进行了检查。我发现它确实是一个 UINavigationController
,并且确实在 UIKit:
最能说明问题的是前两行,显示分配时从 960B 立即变为 0:
我这看起来很不正常,给我带来了危险信号。
试试这个
[self.view.window.rootViewController presentViewController:navCon animated:YES completion:nil];
如果您反对出于某种原因被释放,请不要依赖它。相反,取决于 window 的根控制器。
已解决。事实证明,当这个代码库第一次被编写时,它使用了一个 "stashing" 系统,它将在一个字段中保存任何模态 UIViewController
然后将其关闭。当再次需要时,它会显示隐藏的模态并nil
验证隐藏变量。
问题出在我处理事情的方式上,我不知道这个系统。在直接呈现或关闭模态时,我无意中设置了一个系统呈现僵尸的情况 UINavigationController
。使用此系统后,它按预期工作。