防止iOS中私有属性在block中的循环引用
想看答案可以直接瞅瞅底下代码.
对于一般的@property修饰的属性我们可以使用__weak转换一下self来修饰
__weak typeof(self) weakSelf = self;//然后把self.xxx变成weakself.xxx
那么.对于一些没有使用@property修饰的私有属性呢.比如一下这种.
@interface xxx () {NSString *yyy;}
我们不做任何处理直接在block中使用
// MARK: 1//Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior//Insert 'self->'self.button.didSelectBlock = ^{yyy = @"123131133";NSLog(@"%@",yyy);};
编译器让我们使用self->去修饰这个属性,
当我们换成self->的时候
// MARK: 2//Block will be retained by an object strongly retained by the captured objectself.button.didSelectBlock = ^{self->yyy = @"12313123";NSLog(@"%@",self->yyy);};
额,循环引用了.那么我们如果把self替换成weakSelf呢
// MARK: 3// ERROR//Dereferencing a __weak pointer is not allowed due to possible null value caused by race condition, assign it to strong variable first__weak typeof(self) weakSelf = self;self.button.didSelectBlock = ^{weakSelf->yyy = @"12313123";NSLog(@"%@",weakSelf->yyy);};
好吧,直接报错了.这里需要使用一个strong类型的.
最后,在Block里头使用__strong转一下weakSelf就OK了
// MARK: 4__weak typeof(self) weakSelf = self;self.button.didSelectBlock = ^{__strong typeof(weakSelf) strongSelf = weakSelf;strongSelf->yyy = @"12313123";NSLog(@"%@",strongSelf->yyy);};
防止iOS中私有属性在block中的循环引用相关推荐
- python私有属性怎么定义_Python中私有属性的定义方式
Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): ...
- java中私有属性能不能被继承?
java中私有属性能不能被继承? 以前的课堂中,老师讲继承的时候说过:子类可以继承父类中的属性和方法.可是当我们写代码的时候却能出现一些不一样的情况. 其原因在什么地方?之后通过代码的验证发现出现在了 ...
- javaScript中私有属性和方法
javaScript并没有特殊的语法来表示私有.保护.或公共属性和方法,在这一点上与 java或其他语言是不同的,JavaScript中所有对象的成员是公用的: var myobj={ mypop:1 ...
- python的实例类方法、修饰器类方法、修饰器保护方法、修饰器静态方法中私有属性的区别和自定义property的读写方法
class Cla:__count=0def __init__(self,v):self.__value=vCla.__count+=1def show(self):print('普通实例方法访问私有 ...
- HTML5中margin属性应用,CSS中margin属性及其使用探究
本文向大家描述一下CSS中margin属性的用法,主要包括其属性,使用过程中会遇到的问题,以及一些高级应用等内容,相信本文介绍一定会让你有所收获. CSS中margin问题及使用 margin属性为C ...
- 【无为则无心Python基础】— 62、Python中私有成员方法(类中行为的封装)
Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...
- IOS小知识点5之内存警告、循环引用、交叉引用
IOS的内存使用有以下几个等级,最常见的就是OSMemoryNotificationLevelWarning OSMemoryNotificationLevelUrgent typedef enum ...
- 私有方法,私有属性在继承中的应用
转载于:https://www.cnblogs.com/Smalllv/p/8890132.html
- html中display属性含义,css中display是什么意思?
display是CSS中的一个常用属性,可用于规定元素应该生成的框的类型,在网页开发中经常需要用到.下面本篇文章就来给大家介绍一下CSS display属性,希望对大家有所帮助. display属性规 ...
最新文章
- servlet的重定向错误
- webpack加载postcss,以及autoprefixer的loader
- 设计模式:各个模式间的对比
- Python(27)-模块
- java仿聊天室项目总结_Java团队课程设计-socket聊天室(Day4总结篇)
- matlab线性拟合最大偏差值,algorithm – matlab:线性拟合的最佳点数
- 网易严选App感受WEEX 开发
- 在河北省搜索打印复印店哪家便宜
- 办公软件使用学习笔记:excel第五节。excel表格筛选和排序使用方法总结。
- 2021-03-21
- 从val_loss,train_loss,test_loss中产生的问题
- GTO与OKR工具选择
- html 图片 空白,HTML图片标签空白解决方法
- 有点厉害!用12万行代码堆出来个蔡徐坤,编译还能通过!
- python中的subprocess.Popen()使用详解---以及注意的问题(死锁)
- 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
- 小米平板添加位置服务器,小米平板电脑能定位吗?3种可实现小米平板定位导航的方法介绍_硬件教程...
- 超级简单的3D slicer使用教程(一)
- 佳能Canon imageRUNNER ADVANCE DX C3725 一体机驱动
- 顺丰、圆通、韵达演绎2022年报众生相
热门文章
- 数字电路与C语言基础
- 2021-BUGKU-做题记录-WEB
- 鸿蒙系统笔记本电脑上市,华为:智能手表及笔记本电脑将搭载鸿蒙系统 手机明年上市...
- nginx禁用缓存_如何开启或禁用nginx缓存
- Java中如何将汉字转化为十六进制的数
- c51语言单片机打铃系统设计,毕业论文单片机自动控制打铃系统及设计.doc
- 第十六章 Unity 预制件prefab(上)
- Outlook提示无法保存该附件。无法创建文件......
- 笔记本电脑,充电器一拔立马关机,突然无法用电池怎么办
- 武纺淘宝网站项目总结