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

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

  1. iOS开发之集成iOS9中的Core Spotlight Framework搜索App的内容

    转载自:  http://www.cnblogs.com/ludashi/p/4867511.html iOS开发之集成iOS9中的Core Spotlight Framework搜索App的内容 S ...

  2. Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决

    多层嵌套Fragment中调用系统相机拍照.裁剪 最近公司项目有频繁使用相机拍照的需求,然后频繁的实际使用过程中遇到很多大大小小的坑,在此记录下. (ps.关于一些拍照后图片旋转.裁剪设置返回数据为t ...

  3. iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

    说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Cod ...

  4. mongodb和pymongo中,在多层嵌套数组中插入(更新)符合条件的元素

    数据结构是多层嵌套数组: {"_id" : ObjectId("5de0c88a0f158bf0f60ff99a"),"province" ...

  5. iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

    使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: 首先,创建两个视图控制器,在第一个视图控制器中创建一个UILabel和一个UIButto ...

  6. iOS开发下架App Store中的应用

    下架App的方法: 1.进入itunesconnect:http://itunesconnect.apple.com 登录开发者账号,选择我的App 2.进入要下架的应用,选择"价格与销售范 ...

  7. IOS开发如何在iTunes中查看沙河下的路径

    2019独角兽企业重金招聘Python工程师标准>>> 在应用程序的Info.plist文件中添加Application supports iTunes file sharing键, ...

  8. ios 开发 怎样在项目中使用除系统外的字体

    最近项目中使用到了,需展示银行卡基本信息. 如图 银行卡卡号字体格式并不能用xcode 自带的系统字体来显示,这是我们需要导入外部的字体样式.(银行卡卡号字体:Farrington7B_Qiqi字体) ...

  9. iOS开发学习之YYKit中YYText的深入解析,YYTextShadow的代码解析

    上面的阴影效果是用这样的代码实现的: 可以看到先生成了 YYTextShadow, 然后赋值给了 attributedString 的 yy_textShadow,然后再把 attributedStr ...

最新文章

  1. 数据库连接报错之IO异常(The Network Adapter could not establish the connection)
  2. 前端常见知识点四之webscoket
  3. boost::type_index::ctti_type_index相关的测试程序
  4. leetcode 84. Largest Rectangle in Histogram | 84. 柱状图中最大的矩形(单调栈)
  5. 【离散数学中的数据结构与算法】二 欧几里得算法与裴蜀等式
  6. php输出楼层号,ZBlog开发中实现评论楼层号正确输出的具体方法代码
  7. stm32F051系列 单片机引脚定时器输出pwm波形控制风扇转速
  8. 在SQL Server中加入包含假设和CE模型变化
  9. lucene 分词实现
  10. 数据结构图之三(最短路径--迪杰斯特拉算法)
  11. ai审计_用于内部审计和风险管理的人工智能
  12. 魏德米勒端子eplan宏_魏德米勒端子选型图册(完全版).pdf
  13. 小管家进销存_管钱、管货、管顾客,“北漂”京东便利店主点赞掌柜管家
  14. python12306抢票_GitHub - versionzhang/python_12306: python 12306 抢票工具
  15. 宠物小精灵 动态数组题目解析
  16. Markdown入门指南 --写博客,word必备技术
  17. 小程序接入h5页面_微信小程序跳转外部链接(h5页面)以及数据交互
  18. Necklace of Beads
  19. 哈喽!广袤的世界,这是来自我的第一篇博客。大家一起加油!
  20. 2019全球外汇三大平台排名基本情况

热门文章

  1. Vim安装插件在命令行下看代码
  2. RK方案 manifest.xml编译问题,并解决方案
  3. linux下根据端口查进程,linux根据进程查端口,根据端口查进程
  4. pytorch中切换虚拟环境
  5. 数据结构之并查集:路径压缩继续优化并查集——20
  6. 提取多个字段_【博客翻译】建筑物轮廓线提取以及损坏分类
  7. LeetCode 2069. 模拟行走机器人 II(模拟)
  8. 天池 在线编程 扫雷(BFS)
  9. LeetCode 659. 分割数组为连续子序列(哈希)
  10. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)