1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| 在Objective-C中,定义属性时可以使用不同的关键字来指定属性的特性。常用的属性关键字包括:
1-atomic: 保证在多线程环境下对属性的读取和写入是安全的。 当设置为 atomic 时,系统会使用锁来确保对属性的操作是原子性的。这是默认的行为。
2-nonatomic: 不保证在多线程环境下对属性的读取和写入是安全的。 使用 nonatomic 可以提高性能,因为它不会添加额外的锁来确保原子性操作。
3-strong: 指定属性为强引用,即该属性持有对象的所有权。当对象的强引用计数变为0时,对象会被释放。
4-weak: 指定属性为弱引用,即该属性不持有对象的所有权。当对象的弱引用计数变为0时,对象会被释放。 使用弱引用可以避免循环引用。
5-copy: 指定属性在设置时进行对象的拷贝操作。当使用 copy 关键字修饰属性时, 属性的 setter 方法会对传入的对象进行拷贝操作,从而使得原始对象和属性的值相互独立, 避免了由于原始对象变化而导致属性值也发生变化的情况。
6-readonly: 指定属性为只读,即只生成 getter 方法而不生成 setter 方法。 只读属性只能在初始化时被赋值,之后不能被修改。
7-readwrite: 指定属性为读写,即生成 getter 和 setter 方法。
8-assign: 用于基本数据类型的属性,指定属性直接赋值,不进行内存管理。通常用于非对象类型的属性。
9-unsafe_unretained: 与 assign 类似,但用于指定属性为非强引用的对象类型,不进行引用计数管理。 在对象被释放后,指向该对象的指针不会被置为 nil,容易导致野指针访问问题。
这些属性关键字可以根据需要进行组合使用,以满足具体的需求。一般来说,使用 copy 关键字的情况包括:
1-当属性是一个可变对象类型时,为了避免外部修改对象导致内部数据被篡改,通常会使用 copy 关键字。 2-当属性是一个遵循了 NSCopying 协议的自定义对象时, 为了在赋值时进行深拷贝而不是浅拷贝,也会使用 copy 关键字。 3-当属性的对象可能在设置后被修改,而你希望保持属性的值不受影响时,也可以使用 copy 关键字。
|