Blocks篇:7.循环引用问题
1.ARC下的Block循环引用
1.1 使用weak或unsafe_unretained避免循环引用
一般来说,最简单的这种情况即:block对象作为OC对象的成员,而在block函数体内部直接或间接捕获了该OC对象,造成互相强引用。举例来说:
more >>
技术的,瞎说的,啥都有吧。。。希望。。。
一般来说,最简单的这种情况即:block对象作为OC对象的成员,而在block函数体内部直接或间接捕获了该OC对象,造成互相强引用。举例来说:
more >>
之前所说的,都是Block对象捕获基本数据类型变量时的处理方式。现在我们看一下对于OC对象被Block捕获时的情况。
more >>
我们知道,在Block中,修改捕获变量的方式:
- 对于全局变量,由于实质上Block并未对其进行捕获,故可以直接在Block函数体内部进行变量修改;
- 对于局部的静态变量,由于Block捕获的是其指针,故可以通过指针对原变量进行修改;
- 对于普通的局部变量,由于在Block函数体内使用的版本已经不是之前的变量了(是Block结构体中保存的成员),故编译器不支持直接修改。这种情况下,只能通过“__block”修饰变量进行处理。 more >>
在上一节中我们知道,在Block捕获不同种类的变量时,生成的Block对象的类型(isa指针)分为三种:
- _NSConcreteStackBlock
- _NSConcreteGlobalBlock
- _NSConcreteMallocBlock
此三种类型的Block对象分别存储在栈区、全局(数据区)和堆区
more >>
- Blocks实际上是通过支持Block的编译器,将其转换为标准的C代码进行编译。
- 我们可以使用clang的“-rewrite-objc”命令,将包含Block的源代码转换为C++代码,帮助理解。 more >>
Blocks是带有自动变量值的匿名函数。
写法:
我们知道,weak修饰的变量,其地址是被存储在一个专用的散列表中,此散列表的键值为原内存的散列值(即对象地址的hash值)。
__weak修饰的变量,其主要存在两大功能:
more >>对于持有非自己创建的对象的情况,我们知道,这种情况是指对于非“alloc、new、copy和mutableCopy”开头的并返回对象实例的方法,接收方不负责内存管理。
ARC会在方法实现中将返回值加入到autoreleasePool中,待接收方从中取出使用,延迟释放时机。
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true