首页 > 其他分享 >objc懒加载的坑

objc懒加载的坑

时间:2023-08-29 15:44:58浏览次数:55  
标签:tableView self weak objc delegate dealloc 加载

我们定义一个objc的属性时,有时候会用懒加载,比如

- (UITableView *)tableView {
    if (!_tableView) {
        _tableView = [UITableView new];  
        _tableView.delegate = self;
    }
    return _tableView
}

一般情况下是没什么问题,但是如果在dealloc方法里调用self.tableView,如下:

- (void)dealloc {
    [self.tableView];
}

如果这时_tableView为nil,则会创建tableView,调用_tableView.delegate = self,因为UITableView的delegate属性为weak(一般我们为了避免循环引用,会把delegate这种属性设置成weak),也就是说为self添加了一个weak指针。

@property (nonatomic, weak) id<UITableViewDelegate> delegate;

那么问题来了,objc的runtime为对象添加weak指针时,会检测对象是否正在dealloc,如果正在dealloc,就会进入_objc_fatal函数,然后崩溃。以下是崩溃时的call stack

0	__terminate_with_payload ()
1	abort_with_payload_wrapper_internal ()
2	abort_with_reason ()
3	_objc_fatalv(unsigned long long, unsigned long long, char const*, char*) ()
4	_objc_fatal(char const*, ...) ()
5	weak_register_no_lock ()
6	objc_storeWeak ()

解决方案有几种:
1.在dealloc方法中,使用_tableView代替self.tableView。
2.把self.tableView移出dealloc方法。
3.不在懒加载里面设置weak指针
4.不使用懒加载。

标签:tableView,self,weak,objc,delegate,dealloc,加载
From: https://www.cnblogs.com/wkdwangjun/p/17664971.html

相关文章

  • python加载so库
    fromctypesimportCDLL,RTLD_GLOBALfrom..ankeimportcurrentOSclassLoadSo:def__init__(self,soPath,args):ifcurrentOS!='darwin':forarginargs:"""1、麒麟、UOS环境循环......
  • webpack生产环境优化:懒加载和预加载
    转载请注明来源:http://www.eword.name/Author:ewordEmail:[email protected]生产环境优化:懒加载和预加载一、直接加载浏览器一打开,直接加载了test.js这里使用了直接导入方式。直接导入:import{mul}from'./test';//./src/js/index.js//入口文件console.......
  • webpack生产环境优化:懒加载和预加载
    转载请注明来源:http://www.eword.name/Author:ewordEmail:[email protected]生产环境优化:懒加载和预加载一、直接加载浏览器一打开,直接加载了test.js这里使用了直接导入方式。直接导入:import{mul}from'./test';//./src/js/index.js//入口文件console.......
  • jvm 类加载机制
    类加载机制类加载机制是指我们将类的字节码文件所包含的数据读入内存,同时我们会生成数据的访问入口的一种特殊机制。那么我们可以得知,类加载的最终产品是数据访问入口。虚拟机把Class文件加载到内存,并对数据进行校验,转换解析和初始化,形成可以虚拟机直接使用的Java类型,即java.......
  • 关于onlyoffice完成安装配置后,文档一直加载中的坑
     坑:根据官方文档按顺序安装完erlang,Rabbit,PostgreSQL运行环境后,安装完onlyoffice,配置完成后测试时文档一直提示加载中,无任何其他报错,也没有报错日志,一番排查后初步认定为无法链接到数据库。通过再次阅读官方文档,发现是创建数据库时账号密码和安装时输入不一致导致的。。。调......
  • node实现终端加载中
    简介在node开发脚手架之类的工具中,我们可能会用到进度条或者百分比数字进度展示,但是使用console的话会每次都单独占一行,所以想要看看别的框架是怎么实现的;这里是借鉴了ora这个第三方node包,然后把主要逻辑给提取出来(代码比较短)。oragithub地址上代码constfs=require("fs")......
  • React加载组件后自动触发某函数,而不需要点击按钮
    问题在项目中使用了ReactToPrint来实现打印,但是trigger属性中的按钮需要点击才能执行打印。期望能在组件加载完成时自动执行打印方法。解决可在组件加载完成时,通过id获取组件,并执行该组件的click方法。代码如下:importReact,{useRef,useEffect}from'react';//.........
  • 如何在一个QWidget中加载一个gif作为背景
    如何在一个QWidget中加载一个gif作为背景思路来源:http://daniel-albuschat.blogspot.com/2009/07/background-animation-for-qt-widgets.html概括为使用QMovie渲染背景,具体示例代码如图......
  • 新版Jadx 加载dex报错 jadx.plugins.input.dex.DexException:Bad checksum 解决方法
    <table><tr><tdbgcolor=orange>本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!</td></tr></table>新版Jadx加载dex报错jadx.plugins.input.dex.DexException:B......
  • react-pdf在部分iOS手机上加载pdf失败问题解决
    最近项目快结束了,测试提了一个bug,iOS手机上加载pdf一直在转圈,加载不出来内容。看到这个bug,在电脑上和安卓手机上没有问题,iOS手机中打开确实又问题,初步确定为app问题。我们的项目是集成在客户的app里的,可能是app内的WebView和Safari有一些差异导致的问题。首先直接在iOS手机上用a......