iOS那些属性修饰词

最熟悉的陌生人 ? 应该是最熟悉的熟悉人
atomic, nonatomic, assign, weak, strong, copy, retain, nullable, nonnull, readwrite, readonly

  • nonatomic

    非原子属性, 非线程安全的, 对性能损耗低, 开发中一般用nonatomic, 系统默认是atomic, 所以每次都要用nonatomic去修饰属性.

  • atomic

    原子属性, 系统自动在setter和getter方法加了锁, 性能损耗高, 开发中一般不用.

  • assign

    修饰基本数据类型(NSInteger/Float/Double/Bool...), 基本数据类型分配在栈中, 内存由系统管理. 若修饰对象类型, 再访问对象会报错野指针错误, 对象类型分配在堆中, 而assign不进行强引用, 对象基本上一创建就被释放, 然而指针不为nil, 指针指向被释放了的对象就报错.

  • weak

    同样不会增加引用计数, 跟assign不同, weak只能修饰OC对象类型, 并且是弱引用, 当对象被释放的时候, 指针也会置为nil, 就不会出现野指针.一般用在修饰IBOutlet控件属性 / delegate, 而block属性对象在内部使用self或者其他强引用对象时候, 需要使用__weak弱引用

  • strong

    修饰对象类型, retain+1, 并且是在ARC环境下使用.

  • retain

    也是继续是对象类型, 只能在MRC环境下使用

  • copy

    一般修饰不可变对象, NSString/NSArray/NSDictionary等, 还修饰 block属性, 会将block对象从栈区复制一份到堆区, 避免过早释放.

  • nonnull

    对象的值不允许空

  • nullable

    对象的值允许为空

  • null_unspecified

    不设定是否非空

实际里还有_Null_unspecified / _Nullable / _Nonnull, 意思跟对应的null_unspecified / nullable / nonnull是一样的, 只是放的位置不一样.

  • readwrite

    读写属性, 默认就是读写属性, 系统自动创建setter和getter方法.

  • readonly

    只读属性, 不允许改变属性值, 系统只创建getter方法

你可能感兴趣的:(iOS那些属性修饰词)