美文网首页
iOS属性声明关键字

iOS属性声明关键字

作者: 若水water | 来源:发表于2021-08-20 11:13 被阅读0次
atomic

原子操作,默认设置

  • setter 和 getter 函数式一个原子操作,如果多线程同时调用setter 时,不会出现某一个线程执行完所有语句之前,其他线程就开始执行setter,相当于在函数头尾加了锁,并发访问性能会比较低。
nonatomic

非原子操作

  • 一般不需要多线程的支持时使用,这样在并发访问的时候效率会比较高。在objective-c 里面通常对象类型都应该声明成非原子性的。
    iOS程序启动时,系统只会自动生成一个单一的主线程,程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作。如果在程序中某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,当然也可以做成非原子性的,但是这需要手动加锁来做数据同步。
@synthesize
  • 在iOS6 以前,使用了@property 声明的属性,编译器不会自动生成setter 和 getter 方法。需要在.m文件 中
    @synthesize xxx(属性名),这样编译器会自动生成setter 和 getter 方法。
    在iOS6 以后就不需要这样声明,直接@property 声明属性就可以,编译器会自定生成setter 和 getter 还有_xxx 实例变量
  • 另外@synthesize可以为属性重新指定变量名,使用@synthesize xxx = _yxxx,意思是,生成的setter 和 getter方法将作用于 新的变量_yxxx,而不是系统自动生成的_xxx,这样声明之后,系统不会再自己生成实例变量
  • 当你同时重写 setter 和 getter 时,如果没有特殊声明,系统是不会自动生成实例变量_xxx的,需要@synthesize xxx = _xxx才可以同时重写,才可以在setter 和 getter中操作变量_xxx
    (详细内容请看 https://www.jianshu.com/writer#/notebooks/21593564/notes/61283485/preview)
@dynamic
  • 告诉编译器,不自动生成getter /setter方法 ,其getter 和 setter 方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是在NSManageObject 对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data 框架会在程序运行的时候为此类属性生成getter 和 setter 方法。
    具体操作:
    在nsobject 中继承而来的 +(Bool)resolveInstanceMethod:(SEL)sel 方法中指定 动态实现的方法或者函数。
getter = getterName

指定get 方法,并需要实现这个方法。必须返回与声明类型相同的变量,没有参数

setter = setterName

指定set 方法,并需要实现这个方法。带一个与声明类型相同的参数,没有返回值

readwrite

默认是readwrite,可读可写

readonly

只能读,不可以写

assign(内存管理有关)

所有属性都默认assign,通常用于标量
一种典型的情况是用在对象没有所有权时,通常是delegate,避免造成死循环(但是如果delegate提前释放了,会发生野指针崩溃,系统不能默认给nil,但是weak 可以)

retain

属性必须是objc 对象,拥有对象所有权

copy

属性必须是objc 对象,拥有对象所有权,且对象必须实现NSCopying 协议,一般常用于NSString 类型

参考: https://www.cnblogs.com/pongo/p/8400487.html

相关文章

网友评论

      本文标题:iOS属性声明关键字

      本文链接:https://www.haomeiwen.com/subject/tjwvfktx.html