zoukankan      html  css  js  c++  java
  • __weak与__block修饰符区别

    API Reference对__block变量修饰符的解释,大概意思:

    1.__block对象在block中是可以被修改、重新赋值的。
    2.__block对象在block中不会被block强引用一次,从而不会出现循环引用问题。

    API Reference对__weak变量修饰符的解释,大概意思:

    使用了__weak修饰符的对象,作用等同于定义为weak的property。自然不会导致循环引用问题,因为苹果文档已经说的很清楚,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil。

    因此,__block和__weak修饰符的区别其实是挺明显的:
    1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
    2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
    3.__block对象可以在block中被重新赋值,__weak不可以。
    PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。

    Block的生命周期管理非常的微妙,与ARC混在一起后,更加复杂。

      当Block延stack向上(up)传递的时候,直接返回,编译器会添加[[ copy] autorelease]代码。

      当Block延stack向下传递给需要retain的容器的时候,需要显式的调用[^{} copy]方法。

      在ARC下,__block修改的NSObject指针依然会被retain。

          在ARC下,一个block内引用一个对象的实例变量后,self会被retain,所以极易造成strong reference cycle,可以通过__weak指针来避免这种情形,因为ARC不会为__weak指针retain。

  • 相关阅读:
    #最小生成树,Trie#CF888G Xor-MST
    #Tarjan#洛谷 5676 [GZOI2017]小z玩游戏
    #区间dp#CF1114D Flood Fill
    #构造,二分#[AGC006B] [AGC006D] Median Pyramid
    #0/1分数规划#AT1807 食塩水
    #笛卡尔树#洛谷 3793 由乃救爷爷
    #同余最短路#洛谷 2371 [国家集训队]墨墨的等式
    awk命令使用
    k8s快速删除所有退出的pod
    ratticdb密码管理工具安装使用
  • 原文地址:https://www.cnblogs.com/dhui69/p/5288534.html
Copyright © 2011-2022 走看看