iOS容易产生循环引用的情况

news/2024/7/20 20:14:30 标签: iOS, block, NStimer, 循环引用

1.NSTimer

scene:如果想在类析构函数(dealloc)中自动释放NSTimer,会造成循环引用

reason:因为NSTimer初始化时,会引用类对象(self);如果self想执行dealloc函数,必须等待self引用计数为0,恰恰NSTimer需要在dealloc中释放,所以self引用计数无法为0,NSTimer与self就此僵持。

resolve:需要将NSTimer的释放显式调用。

 

2.block

scene1:类声明一个block属性,亦或是成员方法中使用了block(例如在GCD中使用全局队列),而此时block中又使用了类对象(self),那么会造成循环引用

resolve:block中使用weakSelf

 

scene2:不使用点语法,block直接访问实例变量。

resolve:

__weak typeof(self) weakSelf = self;
self.blkA = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;//加一下强引用,避免weakSelf被释放掉
NSLog(@"%@", strongSelf->_xxView); //不会导致循环引用.
};

resource:https://www.cnblogs.com/wengzilin/p/4347974.html

 

attention:有时在子线程处理数据,如用GCD的全局队列,此时用self,首先会产生上述的循环引用,其次由于无法判断block中执行的时机,或许执行代码块时self已经释放,会导致程序崩溃。因此使用weakSelf,并且首先判断weakself是否存在,否则直接return;或者将weakSelf转成strongSelf。

 

3.delegate(委托)

resolve:声明delegate时,最好使用weak(or assign)

 

summary:

1.虽然使用weakSelf可以避免循环引用,但是由于self可能会提前释放,无法正常执行block,与初衷相悖;此时可以在block内声明strongSelf,这样就可以正常执行block

q1:为什么strongSelf不会造成循环引用

a1:因为strongSelf由block持有,在block执行完毕后,释放strongSelf,因此不会造成循环引用

 

2.空指针与野指针的区别

空指针是 值为 nil 或者 null,调用成员方法不会报错,但是也不会执行相应的方法;野指针是 指向的对象被release,内存被回收,此时指针指向的内存就是“垃圾内存”,所以调用成员方法,就会报野指针错误。


http://www.niftyadmin.cn/n/704313.html

相关文章

svg图标使用心得

初次接触font-icon是使用font awesome库。font-icon比png 图标的优点是矢量(任意缩放也不失真),可通过css样式控制大小颜色,体积更小(可被缓存),使用Iconfont制作font-icon效率也大大提高。 使用…

面向对象与面向过程的本质的区别

前言: 如果你很想搞明白面向对象是什么,面向过程是什么,或者说二者之间的区别是什么,那么就花费一点时间来研读一下这篇博客,你一定会有很大的收获的! 一、面向对象与面向过程的区别 面向过程就是分析出解决问题所需…

Day 57 Nginx负载均衡-高可用

Day 57 Nginx负载均衡-高可用Proxy 10.0.0.5web01 10.0.0.7 #模拟iphone页面web02 10.0.0.8 #模拟android页面1.1 测试负载均衡1.1.1 web01操作如下[rootweb01 conf.d]# cat sj.conf server {listen 80;server_name sj.oldboy.com;location / {r…

【RS】Using graded implicit feedback for bayesian personalized ranking - 使用分级隐式反馈来进行贝叶斯个性化排序...

【论文标题】Using graded implicit feedback for bayesian personalized ranking (RecSys 14 recsys.ACM ) 【论文作者】Lukas LercheTU Dortmund, Dortmund, Germany Dietmar JannachTU Dortmund, Dortmund, Germany 【论文链接】Paper link&#xff…

Xcode10 #import 不提示头文件

参考文章:https://blog.csdn.net/zhutan_123/article/details/82997850

Windows下SonarQube与Jenkins环境的配置使用

Windows下SonarQube与Jenkins环境的配置使用 首先放个SonarQube官方持续化集成测试环境架构图 图中展示了SonarQube自动化环境的整合,前文根据SonarQube官方的架构图,搭建了SonarQube的代码检测分析环境,本文则在此基础上,记录Jen…

Mac下使用Wireshark抓app的网络请求

首先,Mac终端执行: rvictl -s iphone设备UDID 然后,打开Wireshark 设备连接后,mac会出现一个对应的虚拟网络接口,名字是rvi0(如果有多个iphone则累加,rvi1,rvi2…) 最…

iOS--表单formdata上传文件

背景:使用multipart/form-data格式提交图片或者文件到服务器。 方法:使用http请求POST方式,然后在请求头里设置Content-Type为multipart/from-data指定请求的格式。 参数格式: 普通参数: --boundry\r\n Content-Dis…