美文网首页
block编程, __block, __weak, __stro

block编程, __block, __weak, __stro

作者: j_zh | 来源:发表于2019-10-14 12:51 被阅读0次

参考:
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

image.png

<font color=#ff3d44>
【在ARC下】:似乎已经没有栈上的block了,要么是全局的,要么是堆上的。有一个特殊情况:如果仅仅定义了block没有赋值给变量的话,仍是在栈上
</font>

Block编程
  1. 语法
    返回值类型 (^变量名)(形参列表) = ^(形参列表){ 函数体 }
    block实际上是一个结构体(指针?), 同Object *对象。

  2. __block variables
    block 内可以访问全局变量,全局函数,静态变量,block传递的实参,block体内的局部变量。
    block还可以访问block体外的局部变量(同block定义同一级别),这些局部变量会转换为结构体保存在block结构体内,并且不可修改(值copy)。
    __block 修饰,可以将局部变量转成结构保存到堆内存,block体内体外都可以访问并修改

  3. 循环引用
    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
  1. __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
  2. __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
  3. __block对象可以在block中被重新赋值,__weak不可以。
  4. __block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用
strong & __strong

1、strong,weak 用来修饰属性。
strong 用来修饰强引用的属性;weak 用来修饰弱引用的属性;
2、__weak, __strong 用来修饰变量.
__strong 是默认的引用;__weak 声明了一个可以自动 nil 化的弱引用。

相关文章

网友评论

      本文标题:block编程, __block, __weak, __stro

      本文链接:https://www.haomeiwen.com/subject/ozpndqtx.html