在 {} 内声明的,都是 成员变量 (实例变量 + 基础类型变量(int float ...) = 成员变量)
成员变量,是类内部使用的,属性变量,可供类外部访问
(现在的做法,.h 中的属性可供类外部使用,.m中私有)
备注:@dynamic,告诉编译器不要主动生成set、get,由进行时来实现存储。如core data 框架在运行时动态添加属性
在早期,定义一个属性,需要用@synthesize告诉编译器自动生成set、get。现在已默认自动生成,无需这么写了。
在Objective-C中,属性关键字用于声明类的属性,指定其访问修饰符、内存管理语义、读写权限等。下面是一些常见的属性关键字:
nonatomic: 表示属性是非原子的,多线程访问时不会进行加锁操作,因此在性能上比原子属性更高效。但是,它不提供线程安全性。
atomic: 表示属性是原子的,多线程访问时会进行加锁操作,确保访问的线程安全性。这是默认的属性关键字,如果不指定任何关键字,属性会被默认为atomic。
strong: 在ARC(Automatic Reference Counting)下,表示属性是强引用,该属性对对象进行拥有和保留,直到该属性被设置为nil或者另一个对象。
weak: 在ARC下,表示属性是弱引用,该属性对对象进行引用,但不会增加其引用计数,当所引用的对象被释放时,属性会自动设置为nil。
assign: 适用于非对象类型的属性,例如基本数据类型(int、float等),表示直接赋值给属性,不进行引用计数的增加或减少。对于对象类型,一般不使用assign,而是使用weak或strong。
copy: 在ARC下,表示属性在设置时会进行一次拷贝操作,将对象复制到一个新的内存地址,以确保属性值的独立性。一般用于属性为字符串或其他可变对象类型时。
readonly: 表示属性只有getter方法,没有setter方法,即只读属性。
readwrite: 表示属性既有getter方法又有setter方法,即可读写属性。这是默认的属性关键字,如果不指定任何关键字,属性会被默认为readwrite。
getter=customGetterName: 指定自定义的属性的getter方法名,用于改变默认的getter方法名。
setter=customSetterName: 指定自定义的属性的setter方法名,用于改变默认的setter方法名。