iOS 属性关键字的总结

iOS 属性关键字的总结

Posted by angBin on September 4, 2018

iOS 常用关键字

  • 常用关键字:assign、weak、strong、copy、atomic、nonatmoic、readonly、readwrite
  • @synthesize:为属性创建带“_”的成员变量,同时生成getter和setter方法
  • @property:现在的@property除声明属性外,同时也包含了@synthesize功能

关键字之间的区别

assign 与 weak

  • 1、assign可修饰对象也可修饰基本数据类型,weak只能修饰对象,两者都不会引数+1。
  • 2、weak在所修饰的对象释放(引数为0)时会置nil,assign不会置nil,所以assign会产生野指针问题,可能crash,所以一般不用assign修饰对象。
  • 注:可能crash—->即:如果对象释放后未被重新使用,仍存储着原来的值则不会crash,如果对象释放后被重新写入其他内容,则通过野指针访问时就会crash。

atomic 与 nonatomic

  • 1、两者是关于代码执行的原子性与非原子性;
  • 2、atomic会在getter和setter方法中生成锁(互斥锁),确保线程安全。
  • 3、atomic只能保证getter和setter方法单独是线程安全的,不能保证两者同时调用时是线程安全的。
  • 比如:线程A调用了getter,线程B和C调用setter,此时线程A收到的返回值可能是初始值,可能是线程B设置的值,也可能是线程C设置的值。
  • 4、由于nonatomic不会生成锁,所以执行速度会更快。
  • 什么是原子操作:狭义上的原子操作表示一条不可打断的操作,也就是说线程在执行操作过程中,不会被操作系统挂起,而是一定会执行完。在单处理器环境下,一条汇编指令显然是原子操作,因为中断也要通过指令来实现。然而在多处理器的情况下,能够被多个处理器同时执行的操作任然算不上原子操作。因此,真正的原子操作必须由硬件提供支持,比如 x86 平台上如果在指令前面加上 “LOCK” 前缀,对应的机器码在执行时会把总线锁住,使得其他 CPU 不能再执行相同操作,从而从硬件层面确保了操作的原子性。这些非常底层的概念无需完全掌握,我们只要知道上述申请锁的过程,可以用一个原子性操作 test_and_set 来完成。https://bestswifter.com/ios-lock/

各关键字使用场景

weak

  • 1、打破循环引用,修饰代理时使用。

copy

  • 1、修饰block,确保block存储在堆,但是ARC下,在对block赋值时会默认存储在堆。