iOS开发-多层嵌套block中如何使用__weak和__strong

1、关于__weak
__weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等)
__weak修饰的对象在block中不可以被重新赋值。
__weak只在ARC下使用,可以避免循环引用。
__weak修饰对象不会增加引用

    __weak __typeof(self) weakSelf = self;

    self.testBlock = ^{

        [weakSelf doSomeThing];

    });


弱引用不会影响对象的释放,但是当对象被释放时,所有指向它的弱引用都会自定被置为 nil,这样可以防止野指针。

2、关于__block
__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
在MRC下使用__block是可以避免循环引用的;
在ARC下使用 __block typeof(self)weakSelf = self;因为block是用过添加引用来访问实例变量的,所以self会被retain一次,block也是一个强引用,会引起循环引用。

__block修饰对象会增加引用

3、关于 __strong

- (void)viewDidLoad {

    [super viewDidLoad];

    

    MyOBJ *mm = [[MyOBJ alloc]init];

    mm.name = @"Lilei";

    __weak typeof(student) weakSelf = mm;

    

    mm.doBlock = ^{

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            NSLog(@"my name is = %@",weakSelf.name);

        });

    };

    

    mm.doBlock();

}

//输出:my name is = (null)


在dispatch_after这个函数里面。在doBlock()的block结束之后,mm被自动释放了。
又由于dispatch_after里面捕获的__weak的mm,在原对象释放之后,__weak对象就会变成nil,防止野指针。

那么我们怎么才能在weakSelf之后,block里面还能继续使用weakSelf之后的对象呢?

究其根本原因就是weakSelf之后,无法控制什么时候会被释放,为了保证在block内不会被释放,需要添加__strong。

在block里面使用的__strong修饰的weakSelf是为了在函数生命周期中防止self提前释放。strongSelf是一个自动变量当block执行完毕就会释放自动变量strongSelf不会对self进行一直进行强引用。

- (void)viewDidLoad {

    [super viewDidLoad];

    

    MyOBJ *mm = [[MyOBJ alloc]init];

    

    mm.name = @"Hanmeimei";

    __weak typeof(mm) weakSelf = mm;

    

    mm.doBlock = ^{

        __strong typeof(mm) strongSelf = weakSelf;

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            NSLog(@"my name is = %@",strongSelf.name);

        });

        

    };

    

    mm.doBlock();

}

//输出:my name is = Hanmeimei

 

weakSelf 是为了block不持有self,避免Retain Circle循环引用。
在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。

strongSelf的目的是因为一旦进入block执行,假设不允许self在这个执行过程中释放,就需要加入strongSelf。block执行完后这个strongSelf 会自动释放,不会存在循环引用问题。
如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。

4、关于 多层嵌套的block
4.1单层block

- (void)doSomething{

    XXModel *model = [XXModel new];

    

    __weak typeof(self) weakSelf = self;

    

    model.dodoBlock = ^(NSString *title) {

        

        __strong typeof(self) strongSelf = weakSelf;

        strongSelf.titleLabel.text = title;

    };

    

    self.model = model;

}

 

- (void)viewDidLoad {

    [super viewDidLoad];

    [self doSomething];

}


4.2双层block

- (void)setUpModel{

    XXModel *model = [XXModel new];

    

    __weak typeof(self) weakSelf = self;

    

    model.dodoBlock = ^(NSString *title) {

        

        __strong typeof(self) strongSelf = weakSelf;//第一层

        strongSelf.titleLabel.text = title;

        

        __weak typeof(self) weakSelf2 = strongSelf;

        strongSelf.model.dodoBlock = ^(NSString *title2) {

            

            __strong typeof(self) strongSelf2 = weakSelf2;//第二层

            strongSelf2.titleLabel.text = title2;

        };

    };

    

    self.model = model;

}


这样就避免的引用循环,不管都多少个block嵌套,都可以按照这样来做。

 

 

 

转自:https://blog.csdn.net/nathan1987_/article/details/82749057

转载于:https://www.cnblogs.com/huangzs/p/10984034.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为了节省能量,人类演化出了“不合规律”的大脑神经元 | Nature

图片来源:Pixabay来源:麻省理工学院、科研圈神经元通过电脉冲相互交流,而电脉冲是由控制钾和钠等离子流动的离子通道产生的。在一项新研究中,美国麻省理工学院(Massachusetts Institute of Technology)的神…

linux标准I/O——流的相关操作

文章目录1.刷新流2.不断将键盘内容写入g.txt文件中3.定位流4.定位流的实例1.刷新流 2.不断将键盘内容写入g.txt文件中 #include<stdio.h>#define N 1024 int main() {FILE *fd;char buf[N];fdfopen("./g.txt","a");while(1){fgets(buf,N,stdin);fpu…

国外发明的10大仿生机械,这才是真正的黑科技!

来源&#xff1a;工信头条仿生机械就是模仿生物的形态、结构和控制原理设计制造出的功能更集中、效率更高并具有生物特征的机械。研究仿生机械的学科称为仿生机械学&#xff0c;它是20世纪60年代末期由生物学、生物力学、医学、机械工程、控制论和电子技术等学科相互渗透、结合…

linux标准I/O——格式化输出

文章目录1.格式化输出函数2.输出日期到文本文档和数组中3.练习3.1 题目3.2 提示3.3 实现1.格式化输出函数 2.输出日期到文本文档和数组中 #include<stdio.h>int main() {int year2021,month4,date8;FILE *fd;char buf[64];fdfopen("data.txt","a");…

如何让css与js分离

在 webpack 我们如何让 css 与 js 分离&#xff1b; 我们需要安装插件&#xff1a;extract-text-webpack-plugin 1. 用&#xff1a;npm 下载插件 npm install extract-text-webpack-plugin --save-dev 2.在官网上查看用法&#xff1a;https://www.npmjs.com/ less 的配置&#…

钱学森在30年前对虚拟现实和元宇宙的思考

以下文字是钱学森在1990年给汪成为院士的信中对虚拟现实技术的科学意义和未来发展给与的思考和建议&#xff0c;他也提出可以将虚拟现实技术成为灵境技术。

项目:NMEA2000的数据格式解析

1.基础资料 1.1 CAN扩展帧格式介绍 can扩展帧 1.2 can扩展帧和NMEA2000格式关系 CAN帧和NMEA2000关系 1.3 NMEA2000_v1-300_App_B1_PGN_Table PGN 1.4 GPS NMEA2000数据解析 GPS NMEA2000数据解析

SpringBoot项目部署到独立的Tomcat上

1.修改启动类 1 SpringBootApplication2 MapperScan("com.wm.springboot.dao")3 public class SpringbootApplication extends SpringBootServletInitializer {4 5 Override6 protected SpringApplicationBuilder configure(SpringApplicationBuilder builde…

一图读懂:中国科学院“基础研究十条”

来源&#xff1a;中科院之声未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;大脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;大脑技术和企业图…

linux文件IO——文件IO介绍

文章目录1.文件IO和标准IO区别2.什么是文件IO3.文件描述符4.open函数5.close函数1.文件IO和标准IO区别 \qquad标准IO遵从ANSIC&#xff0c;文件IO遵从POSIX&#xff1b; \qquad标准IO有缓冲机制&#xff0c;文件IO没有&#xff1b; \qquad标准IO通过流FILE来操作&#xff0c;文…

量化因果涌现表明:宏观可以战胜微观

来源&#xff1a;集智俱乐部作者&#xff1a;Erik P. Hoel, Larissa Albantakis, Giulio Tononi 译者&#xff1a;赵婷婷 审校&#xff1a;梁金 编辑&#xff1a;邓一雪 导语复杂系统内的因果关系可以从不同时空尺度来分析。通常认为&#xff0c;由于微观尺度包含了所有细节&am…

SpringBoot RabbitMQ 延迟队列代码实现

场景 用户下单后&#xff0c;如果30min未支付&#xff0c;则删除该订单&#xff0c;这时候就要可以用延迟队列 准备 利用rabbitmq_delayed_message_exchange插件&#xff1b; 首先下载该插件&#xff1a;https://www.rabbitmq.com/community-plugins.html 然后把该插件放到rabb…

linux文件IO——编程接口

文章目录1.read函数2.使用read函数计算文本文件中字符总数3.write函数4.复制文本文件5.指定文件名的方式复制文件6.lseek函数1.read函数 2.使用read函数计算文本文件中字符总数 #include<stdio.h> #include<stdlib.h> #include <sys/types.h> #include <…

为提高能量利用效率,大脑会对感官进行预测

来源&#xff1a;混沌巡洋舰编译&#xff1a;王晔编辑&#xff1a;青暮我们的大脑是一个包裹在颅骨中重达三磅的组织块&#xff0c;它是如何从感觉中创造出感知的&#xff1f;这一直以来都是个谜。数十年来&#xff0c;有大量的研究和证据表明&#xff0c;大脑不可能只是简单地…

linux文件IO——目录操作和文件属性

文章目录1.opendir函数2.readdir函数3.closedir函数4.打印指定目录下的所有文件名称5.chmod函数和fchmod函数6.获取文件的属性1.opendir函数 2.readdir函数 3.closedir函数 4.打印指定目录下的所有文件名称 #include<stdio.h> #include <sys/types.h> #include &l…

视觉里程计VO

视觉里程计的主要问题是如何根据图像来估计相机运动&#xff0c;VO的实现方法&#xff0c;按照是否需要提取特征&#xff0c;分为特征点法的前端以及不提取特征的直接法前端。基于特征点法的前端&#xff0c;长久以来被认为是视觉里程计的主流方法&#xff0c;它运行稳定&#…

信息大脑如何从物理大脑中涌现?

来源&#xff1a;集智俱乐部作者&#xff1a;田洋 审校&#xff1a;梁金 编辑&#xff1a;邓一雪 导语我们的大脑是一个处理信息的动力学系统。数百亿个神经元时刻接受内部和外部刺激&#xff0c;对这些信息进行编码处理&#xff0c;进而形成我们对世界的认知。大脑的信息机能本…

操作系统——内存

文章目录1.内存的定义2.从写程序到程序运行3.逻辑地址和物理地址3.1 逻辑地址/物理地址的定义3.2 逻辑地址到物理地址的转换3.2.1 绝对装入3.2.2 静态重定位3.2.3 动态重定位4.链接的方式4.1 静态链接4.2 装入时动态链接4.3 运行时动态链接5.内存管理5.1 内存保护5.2 地址转换5…

德克萨斯AM大学的一项新技术可以让我们通过触摸屏「感受」物体

来源&#xff1a;新智元德克萨斯A&M大学的一项新技术可以让我们通过触摸屏「感受」物体&#xff0c;这项新技术将「定义」下一代手指与设备的交互方式&#xff0c;进一步发展则有希望超越目前触摸屏对人们触摸的匮乏感知和反应。该研究最近发表在《高级材料》&#xff08;A…

Git的工作流程

git的工作流程为: 克隆Git资源作为工作目录 在克隆的资源上添加或者修改文件 如果别人修改了,你可以更新资源 在提交前查看修改 提交修改 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交 推送到服务器 转载于:https://www.cnblogs.com/qingmuchuanqi48/p/10988263.ht…