__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。

posted @ 2013-04-20 18:50  Eric.wei  阅读(484)  评论(0编辑  收藏  举报