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] 崩溃了?