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。

  • 相关阅读:
    欢庆入住博客园
    指定线程所运行的CPU核心
    [GNU/Linux MakeFile] 第一章:概述
    [.NET][编程之美][1.1]C# 实现让CPU占用率曲线听你的指挥 – 可指定运行核心
    vmware workstation 7.1 正式版 序列号 注册机
    linux:设置 linux定时运行命令脚本 (crontab详解)
    守护进程(Daemon)
    Linux下定时执行脚本
    二叉树的遍历(转)
    dup,dup2,fcntl,ioctl用法简述
  • 原文地址:https://www.cnblogs.com/dhui69/p/5288534.html
Copyright © 2011-2022 走看看