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。

  • 相关阅读:
    不允许修改SQLserver2008r2表中字段的属性问题
    SQL学习笔记 SQL ORDER BY 关键字
    超爱http://www.runoob.com/菜鸟编程
    sqlserver数据类型
    SQL重要命令
    Task--计算器
    改变文本框内容
    Android Studio
    eclipse导入Android项目出现红色感叹号----Solved
    2017-09-09
  • 原文地址:https://www.cnblogs.com/dhui69/p/5288534.html
Copyright © 2011-2022 走看看