在Block中使用weakSelf与strongSelf的意义

我们都会声明一个弱引用在block中使用, 目的就是防止循环引用,  那么weakSelfstrongSelf一起使用目的是什么呢? 首先先定义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的意义相关推荐

  1. block里的self、weakSelf、strongSelf

    转自  http://www.cnblogs.com/zhang-chi/p/5532272.html ARC下,关于block里面使用self.weakSelf.strongSelf,理解一直没有特 ...

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

    1.关于__weak __weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等) __weak修饰的对象在block中不可以被重新赋值. __w ...

  3. 防止iOS中私有属性在block中的循环引用

    想看答案可以直接瞅瞅底下代码. 对于一般的@property修饰的属性我们可以使用__weak转换一下self来修饰 __weak typeof(self) weakSelf = self;//然后把 ...

  4. 在block中使用self

    __weak typeof(self) weakSelf = self; [self doABlockOperation:^{     __strong typeof(weakSelf) strong ...

  5. Block学习-关于Block是如何实现的,以及block中参数传递

    先看下面的一段代码,判断输出结果: int a = 0; void (^block)(void) = ^{printf("a = %i\n",a);}; a=10; block() ...

  6. c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)

    C++中函数的安全版本的意义及strcpy函数的功能和差别(图) 我们在进行C/C++编程时,会发现中有些函数在VS中使用时,提示使用_s的函数版本,其实这种_s的函数版本是安全版本,它们完成的任务与 ...

  7. linux文件目录含义,Linux中文件权限目录权限的意义及权限对文件目录的意义

    linux中目录与文件权限的意义 一.文件权限的意义 r:可以读这个文件的具体内容: w:可以编辑这个文件的内容,包括增加删除文件的具体内容: x:文件就具有了可执行的权限-------注意:这里和w ...

  8. 数据库中CreateAt、UpdateAt字段的意义

    这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析后端知识/技能,本篇分享的是: [ 数据库中Cr ...

  9. python实践意义_在Python学习中过程比结果更有意义

    原标题:在Python学习中过程比结果更有意义 如果人生是一趟旅行,那我们最应该关注的是沿途的风景而不是最终的目的地.对于学习Python而言,提升自身能力.提高处理问题的速度.培养自己勤思考.善于思 ...

最新文章

  1. 原来你是这样子的OpenAI!来看看它背后那些有趣的人和事
  2. FTP 服务搭建及常用的命令脚本及传输协议基础普及
  3. zabbix之rpm简单快速安装详解
  4. SpringMVC拦截器-用户登录权限控制代码实现1
  5. jquery较验组织机构编码
  6. Windows Server 2008 NFS
  7. python 收发邮件_python发送各类邮件的主要基本方法
  8. Elasticsearch7.15.2 安装、部署(linux环境)
  9. 苹果悬赏100万美元找漏洞 辞职的理由找到了!
  10. 利用百度地图坐标拾取系统获取经纬度,并将其坐标转换保存成SHP文件
  11. Java代理(proxy)
  12. 听课记录范文计算机基础,【教师听课记录范文】_听课记录范文三篇
  13. 【ACWing】487. 金明的预算方案
  14. 安卓近距离通信--蓝牙通信开发
  15. rk3288[android 6.0] 调试串口修改为普通串口
  16. 中国日期转化标准日期(YYYY-MM-dd)
  17. 链表实现c语言通讯录管理系统,C++链表实现通讯录管理系统
  18. Java 学习 - 全文索引 - Lucene
  19. 双网卡同时连接内网和外网的解决方案
  20. 一些小技巧,想起来了就码上!

热门文章

  1. hessian spring实例整合
  2. LeetCode Hot100 ---- 排序专题
  3. Windows7环境下用VirtualBox (5.1)上安装Ubuntu 17.10
  4. 谷歌 MapReduce 初探
  5. ooooo123123emabc
  6. 拖欠水费可能影响个人征信,大家怎么看?
  7. 等额本息和等额本金,哪个还款方式更划算?
  8. python判断是不是整数的命令_介绍python判断一个数是不是正小数和整数的方法
  9. 虚拟局域网软件开源_ZeroTier虚拟局域网免费远程桌面体验--替代TeamViewer
  10. c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程