参考:
block编程
iOS __weak和__strong在Block中的使用
__block & __weak & __strong
OC中Block使用了__weak和__strong依然不会循环引用原因
__weak与__block区别,深层理解两者区别
Apple - Blocks Programming Topics
Block存储区域,全局(_NSConcretGlobalBlock)、栈(_NSConcretStackBlock)、堆(_NSConcretMallocBlock)
全局block:定义函数外的block;定义函数内,但没有捕获任何自动变量
栈block:定义函数内,并捕获自动变量
堆block:栈block copy

<font color=#ff3d44>
【在ARC下】:似乎已经没有栈上的block了,要么是全局的,要么是堆上的。有一个特殊情况:如果仅仅定义了block没有赋值给变量的话,仍是在栈上
</font>
Block编程
-
语法
返回值类型 (^变量名)(形参列表) = ^(形参列表){ 函数体 }
block实际上是一个结构体(指针?), 同Object *对象。 -
__block variables
block 内可以访问全局变量,全局函数,静态变量,block传递的实参,block体内的局部变量。
block还可以访问block体外的局部变量(同block定义同一级别),这些局部变量会转换为结构体保存在block结构体内,并且不可修改(值copy)。
__block 修饰,可以将局部变量转成结构保存到堆内存,block体内体外都可以访问并修改 -
循环引用
block体内引用对象或对象属性,都会retain该对象。
__weak可避免循环引用。
__weak弱引用,不会使retainCount+1,并且在对象释放后自动变为nil。
__unsafe_unretained和__weak相似,但不会在对象释放后自动变为nil
__weak __typeof(self) weakSelf = self;
self.block = ^{
__strong __typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doSomeThing];
[strongSelf doOtherThing];
}
};
__block & __weak
- __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
- __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
- __block对象可以在block中被重新赋值,__weak不可以。
- __block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用
strong & __strong
1、strong,weak 用来修饰属性。
strong 用来修饰强引用的属性;weak 用来修饰弱引用的属性;
2、__weak, __strong 用来修饰变量.
__strong 是默认的引用;__weak 声明了一个可以自动 nil 化的弱引用。
网友评论