static
修饰__block
__block
修饰的局部变量会随着 block 销毁而销毁,内存管理与 block 同步,全局/局部静态/全局静态,存在于程序的整个生命周期,成员变量的生命周期由其类控制安全
assign能够用于非对象类型,而weak必须用于对象类型atom
修饰变量类型的区别
weak 只能够修饰对象。若是修饰基本数据类型,编译器会报错-“Property with ‘weak’ attribute must be of object type”。 assign 可修饰对象,和基本数据类型。当须要修饰对象类型时,MRC时代使用unsafe_unretained。固然,unsafe_unretained也可能产生野指针,因此它名字是"unsafe_”。代理
是否产生野指针的区别
weak 不会产生野指针问题。由于weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,以后再向该对象发消息也不会崩溃。 weak是安全的。 assign 若是修饰对象,会产生野指针问题;若是修饰基本数据类型则是安全的。修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。指针
均可以修饰对象类型,可是assign修饰对象会存在问题。code
assign 适用于基本数据类型如int,float,struct等值类型,不适用于引用类型。由于值类型会被放入栈中,遵循先进后出原则,由系统负责管理栈内存。而引用类型会被放入堆中,须要咱们本身手动管理内存或经过ARC管理。
对象
weak 适用于delegate和block等引用类型,不会致使野指针问题,也不会循环引用,比较安全。生命周期
在ARC中,不管是strong修饰的对象仍是weak修饰的对象,都再也不须要在dealloc中将对象置为nil,编译器会自动帮咱们处理,即便编译器不帮助咱们处理,在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。内存