zoukankan      html  css  js  c++  java
  • __weak&__block&__unsafe__unretain

    __block修饰的变量是可以在blocks中共享block外的父类中的变量。这样,即使父类已经超出生存周期,只要任何父类的__block修饰的变量存在于任何一个没有销毁的block块中,那么这个变量就是有效的,不会出现BAD_access错误。多个block块在一个给定的作用域中可以同时的使用共享内存变量。

    __weak描述的是一个特定的引用类型,它不保证修饰的变量在生命周期。当weak修饰的变量所指向的强引用变量销毁时,weak类型的弱引用变量会被置为nil。

    这两个修饰变量的类型是完全不同的概念,当block中使用__block的变量时,__block变量不会copy一份在block中,而是跟外部使用同一内存变量。

    __weak只是复制了一个指向对象的指针,原指向的变量不会做retain操作。

    如果工程mini sdk require:4.3 or latest,工程同时也启用了ARC,那么建议弱类型的变量使用__weak,它会保证在指向的对象释放的同时,__weak修饰的变量指向nil。

    如果工程mini sdk require:4.3以下,或者工程没有启用ARC,那么这个时候只能使用__block,在这种修饰下,谨记,__block修饰的变量如果已经释放,这个时候__block修饰的变量不会被重置为nil。

    上面就是这两个修饰符的微小差异,确保能够正确理解。

    还有一个跟这两个类似的修饰符,__unsafe_unretained,这个修饰符在ios 4.3以后版本跟__weak基本一致,4.3之前不同。同样的这个变量也是不会被置为nil。

    作者:W.M.steve
    出处:http://www.cnblogs.com/weisteve/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/weisteve/p/3032948.html
Copyright © 2011-2022 走看看