在Block中使用weakSelf与strongSelf的意义
在Block中使用weakSelf与strongSelf的意义
我们都会声明一个弱引用在block
中使用, 目的就是防止循环引用, 那么weakSelf
与strongSelf
一起使用目的是什么呢? 首先先定义2个宏:
#define YXWeakSelf(type) __weak typeof(type) weak##type = type; #define StrongSelf(type) __strong typeof(type) type = weak##type;
在Controller中YXWeakSelf(self)
与YXStrongSelf(self)
一起使用情况很多,为了防止循环引用,还是不懂原因的见如下实例:
我们创建一个shop
并且在shop.myBlock
代码块中使用弱引用YXWeakSelf(shop)
LRShop *shop = [[LRShop alloc]init];shop.string = @"welcome to our company";//弱引用YXWeakSelf(shop)shop.myBlock = ^{NSLog(@"%@",weakshop.string);};shop.myBlock();
YXWeakSelf(shop)
与YXStrongSelf(shop)
一起使用
LRShop *shop = [[LRShop alloc]init];shop.string = @"welcome to our company";//弱引用YXWeakSelf(shop);shop.myBlock = ^{//强引用YXStrongSelf(shop)NSLog(@"%@",shop.string);};shop.myBlock();
这2个打印结果都是shop.string
有值并且shop
也销毁了, 看起来是没什么区别:
仅仅使用YXWeakSelf(shop)
并且在myBlock
中增加一个延迟3秒在输出就会出现问题, 虽然对象销毁了, 输出的值却是null
//弱引用YXWeakSelf(shop);shop.myBlock = ^{dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{NSLog(@"%@",weakshop.string);});};shop.myBlock();
如果YXWeakSelf(shop)
与YXStrongSelf(shop)
一起使用输出的shop.string
有值,对象也销毁了, 我就不再截图给大家看了!
//弱引用YXWeakSelf(shop)shop.myBlock = ^{//强引用YXStrongSelf(shop)dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{NSLog(@"%@",shop.string);});};shop.myBlock();
通过上面一堆的解释, 我们明显发现YXWeakSelf(shop)
与YXStrongSelf(shop)
一起使用的好处, 不但能打印出我想要的值,而且也不会造成循环引用 , 在开发中这两个方法可以根据实际情况进行使用!
在Block中使用weakSelf与strongSelf的意义相关推荐
- block里的self、weakSelf、strongSelf
转自 http://www.cnblogs.com/zhang-chi/p/5532272.html ARC下,关于block里面使用self.weakSelf.strongSelf,理解一直没有特 ...
- iOS开发-多层嵌套block中如何使用__weak和__strong
1.关于__weak __weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等) __weak修饰的对象在block中不可以被重新赋值. __w ...
- 防止iOS中私有属性在block中的循环引用
想看答案可以直接瞅瞅底下代码. 对于一般的@property修饰的属性我们可以使用__weak转换一下self来修饰 __weak typeof(self) weakSelf = self;//然后把 ...
- 在block中使用self
__weak typeof(self) weakSelf = self; [self doABlockOperation:^{ __strong typeof(weakSelf) strong ...
- Block学习-关于Block是如何实现的,以及block中参数传递
先看下面的一段代码,判断输出结果: int a = 0; void (^block)(void) = ^{printf("a = %i\n",a);}; a=10; block() ...
- c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)
C++中函数的安全版本的意义及strcpy函数的功能和差别(图) 我们在进行C/C++编程时,会发现中有些函数在VS中使用时,提示使用_s的函数版本,其实这种_s的函数版本是安全版本,它们完成的任务与 ...
- linux文件目录含义,Linux中文件权限目录权限的意义及权限对文件目录的意义
linux中目录与文件权限的意义 一.文件权限的意义 r:可以读这个文件的具体内容: w:可以编辑这个文件的内容,包括增加删除文件的具体内容: x:文件就具有了可执行的权限-------注意:这里和w ...
- 数据库中CreateAt、UpdateAt字段的意义
这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析后端知识/技能,本篇分享的是: [ 数据库中Cr ...
- python实践意义_在Python学习中过程比结果更有意义
原标题:在Python学习中过程比结果更有意义 如果人生是一趟旅行,那我们最应该关注的是沿途的风景而不是最终的目的地.对于学习Python而言,提升自身能力.提高处理问题的速度.培养自己勤思考.善于思 ...
最新文章
- 原来你是这样子的OpenAI!来看看它背后那些有趣的人和事
- FTP 服务搭建及常用的命令脚本及传输协议基础普及
- zabbix之rpm简单快速安装详解
- SpringMVC拦截器-用户登录权限控制代码实现1
- jquery较验组织机构编码
- Windows Server 2008 NFS
- python 收发邮件_python发送各类邮件的主要基本方法
- Elasticsearch7.15.2 安装、部署(linux环境)
- 苹果悬赏100万美元找漏洞 辞职的理由找到了!
- 利用百度地图坐标拾取系统获取经纬度,并将其坐标转换保存成SHP文件
- Java代理(proxy)
- 听课记录范文计算机基础,【教师听课记录范文】_听课记录范文三篇
- 【ACWing】487. 金明的预算方案
- 安卓近距离通信--蓝牙通信开发
- rk3288[android 6.0] 调试串口修改为普通串口
- 中国日期转化标准日期(YYYY-MM-dd)
- 链表实现c语言通讯录管理系统,C++链表实现通讯录管理系统
- Java 学习 - 全文索引 - Lucene
- 双网卡同时连接内网和外网的解决方案
- 一些小技巧,想起来了就码上!
热门文章
- hessian spring实例整合
- LeetCode Hot100 ---- 排序专题
- Windows7环境下用VirtualBox (5.1)上安装Ubuntu 17.10
- 谷歌 MapReduce 初探
- ooooo123123emabc
- 拖欠水费可能影响个人征信,大家怎么看?
- 等额本息和等额本金,哪个还款方式更划算?
- python判断是不是整数的命令_介绍python判断一个数是不是正小数和整数的方法
- 虚拟局域网软件开源_ZeroTier虚拟局域网免费远程桌面体验--替代TeamViewer
- c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程