removeFromSuperview 随机崩溃

Posted

技术标签:

【中文标题】removeFromSuperview 随机崩溃【英文标题】:removeFromSuperview crash random 【发布时间】:2016-08-01 07:52:21 【问题描述】:

我不知道如何描述正常的场景,调用removeFromSuperview时会导致0.3%的崩溃。

这是踪迹:

Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0x43746553
Crashed Thread: 0
0 libobjc.A.dylib 0x000000019340fbd0 objc_msgSend + 16
1 UIKit 0x000000018771f0e8 ___UIViewWillBeRemovedFromSuperview + 404
2 UIKit 0x0000000187452c0c -[UIView(Hierarchy) removeFromSuperview] + 108
...

所有代码都是:

[_control removeFromSuperview];
_control = nil;

我是真的

1.在主线程中调用。

2.我调试我的应用程序,从来没有遇到过崩溃。

3.类是ARC。

希望很快会有消息。​​


2016.09.02

我尝试用这些保护后再次遇到它

if(_control && _control.superview) 
   [_control removeFromSuperview];
    _control = nil;

感谢任何建议,因为我完全被难住了。

【问题讨论】:

何时调用[_control removeFromSuperview],崩溃提示对象_control可能在调用该方法之前已被释放。 我忘了说,类是弧。我应该担心在 arc 中的释放吗? 没有,但是在调用方法之前,对象_control可能已经通过ARC释放了。 如果喜欢你说的话,我应该添加像if (_control) 这样的行可以帮助崩溃吗?我不知道什么场景会在 ARC 中释放我的观点...... 是的,这可以防止崩溃,但是您将无法调用removeFromSuperView,请尝试通过添加NSLogs 找到执行调用序列,这会给您带来想法。 【参考方案1】:

我想你的control 对象属于UIViewController,所以当你调用self.control_control 时,你实际上调用了yourViewController.control。 但是,如果您尝试调用 self.control 而您的 UIViewController 已经被释放(它不再存在),这将导致崩溃。

您可以尝试使用weak 引用您的控制器来调用self.control

__weak MyObject *weakSelf = self;
[weakSelf.control removeFromSuperview];
weakSelf.control = nil;

调用weakSelf.control 在这里没有任何引用,这意味着当您的UIViewController 被释放时,您的control 也将被释放,因此这不会再导致崩溃。

这可能不是问题的实际原因,但有可能。

【讨论】:

如果你设置了一个弱引用的对象。它不会保留更长时间。它将被释放。因此应用程序将崩溃

以上是关于removeFromSuperview 随机崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 [UIScrollView removeFromSuperview] 崩溃了?

UIView removeFromSuperview 导致应用程序崩溃

出口集合 removefromsuperview

removeFromSuperview() 耗时过长

removeFromSuperview() 并不总是有效

无法使用 removeFromSuperview 方法删除视图