单步调试报错 Thread 1: EXC_BAD_ACCESS (code=1, address=0x6565656565)

简介: 单步调试报错 Thread 1: EXC_BAD_ACCESS (code=1, address=0x6565656565)

错误使用window引起的内存释放异常而闪退问题

我们经常会碰到app突然crash掉的现象,当出现thread 1:exc_bad_access(code=1,address=0x6565656565)的提示时,这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的。

现象是:从根页面进入子页面,然后返回根页面就闪退。只有iOS13,iPhone6手机闪退,其它手机没有发现这类闪退。

异常断点跟中闪退在main函数中,进一步跟踪,闪退在objc_release后的0x1b3a6063c <+1936>: ldr x0, [sp, #0x38]。可以看到是显然的内存释放异常。

由于定位不到具体对象,只知道问题肯定出在其它子页面,因为其它页面都正常。

后面只有通过屏蔽代码,然后逐步放开代码,采用试错的方法定位到具体那一行代码。

经过几天测试终于查到具体的导致闪退的代码:

    [self.view addSubview:self.window];
    [self.window mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.leading.trailing.bottom.equalTo(self.view);
    }];
- (UIWindow *)window{
    if (!_window) {
        _window = [UIWindow new];
        _window.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6];
//        _window.alpha = 0.8;
    }
    return _window;
}

分析应该是把window自己直接加在self.view上的,这样用法到只页面无法正常释放而闪退。

进一步分析,原来的作者的目的是:

他希望的不是window,是普通的view,只是这个view要置于页面的最前端,开始是隐藏的,当点击按钮就出现。其实view完全能满足他的需求。要想使它置于最前端有很多种方法,并非一定要用window。其实window主要是用在无法直接获取当前window(不包括通过全局系统变量获取)。如网络请求基础组件。当然还有一种场景是页面过于复杂,存在很多层级关系,并保证有的得页面居于最前面,甚至是多个人同时开发一个超级复杂的页面。为了解藕这种页面会用到多层次window。一般的开发很少涉及多window。最多是获取当前的keywindow(0层window),在上面加入东西,用完要移除。

他的想法是想用window,但是她对window又一知半解,又用到父试图的东西。window要比她想象复杂的多。

使用window的目的就是要实现父试图隔离,像两个页面一样。

其它的她的目的很明确十分明确,就是想实现一个弹窗显示在页面的最前端。没有必要用到window。我的代码最多只出现了三个window,有三层次序关系。多了我也很难管理。有时候window用了是比不用好,但是用不好就是坑。修改后的代码:

- (UIView *)window{
    if (!_window) {
        _window = [UIView new];
        _window.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6];
//        _window.alpha = 0.8;
    }
    return _window;
}
目录
相关文章
|
26天前
Showing Recent Messages Command CodeSign failed with a nonzero exit code
Showing Recent Messages Command CodeSign failed with a nonzero exit code
19 0
|
26天前
|
开发者 iOS开发
no identity found Command CodeSign failed with a nonzero exit code
no identity found Command CodeSign failed with a nonzero exit code
20 0
|
10月前
|
Java Maven Android开发
成功解决FATAL ERROR in native method: JDWP on getting class status, jvmtiError=JVMTI_ERROR_WRONG_PHASE
成功解决FATAL ERROR in native method: JDWP on getting class status, jvmtiError=JVMTI_ERROR_WRONG_PHASE
|
1月前
|
机器学习/深度学习 Java Android开发
记录一个Flutter运行的异常FAILURE: Build failed with an exception. What went wrong: A problem occurred config
记录一个Flutter运行的异常FAILURE: Build failed with an exception. What went wrong: A problem occurred config
81 0
|
8月前
|
Java
【Java异常】ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit erro
【Java异常】ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit erro
145 0
解决:Oops internal error 40343 occured.Further work is not possible and IDA will close (打开文件出现40343错误)
解决:Oops internal error 40343 occured.Further work is not possible and IDA will close (打开文件出现40343错误)
263 0
|
Python
pychram中提示:Process finished with exit code 0
"Process finished with exit code 0" 是PyCharm中的提示信息,表示程序已经成功地执行完毕并且没有发生任何错误。在PyCharm中,当程序正常终止并返回退出代码0时,这个消息会在控制台中显示。 在PyCharm中运行程序时,它会在一个单独的进程中执行,当程序完成执行后,它会向操作系统返回一个退出代码。退出代码0表示程序成功执行完毕,而非零的退出代码通常表示错误或异常终止。 当出现"Process finished with exit code 0"的提示时,意味着你的程序已经成功地执行完毕,没有发生任何错误或异常情况。你可以通过检查程序输出或任何其他预
1332 0
|
Java Android开发
Bad method handle type 7异常解决
在利用androidx版本写demo时,在添加了一些依赖后,遇到了`java.lang.ClassNotFoundException`bug,这就很奇怪了,我就添加rxjava3的依赖,就给我报这个错误。
|
jenkins 持续交付 图形学
报错Command XXXX/dsymutil failed with exit code 11
报错Command XXXX/dsymutil failed with exit code 11
236 0
报错Command XXXX/dsymutil failed with exit code 11
|
iOS开发
iOS linker command failed with exit code 1 (use -v to see invocation)解决方法
iOS linker command failed with exit code 1 (use -v to see invocation)解决方法
1803 0