Object-C @property中有哪些属性关键字?
参考答案:
在 Objective-C 中,@property
指令用于在类接口中声明属性。这些属性可以是实例变量,也可以是类变量(使用 class
关键字)。@property
指令可以包含多个属性关键字,这些关键字定义了属性的行为。以下是一些常见的属性关键字:
-
原子性 (Atomicity)
atomic
:默认属性,保证属性的访问是线程安全的。但是,这并不意味着整个对象都是线程安全的,它仅仅保证属性访问的原子性。在多线程环境中,可能需要额外的同步机制。nonatomic
:属性的访问不是线程安全的,但访问速度更快。在单线程环境中或已经通过其他方式同步访问的属性中,通常会使用这个关键字。
-
内存管理
assign
:适用于基础数据类型,如 C 的数据类型(int
,float
,enum
,struct
等)。这个关键字告诉编译器直接进行简单的赋值操作。retain
(对于非 ARC 项目):对于 Objective-C 对象,这个关键字告诉编译器在赋值时保留对象(即增加其引用计数)。copy
:对于 Objective-C 对象,这个关键字告诉编译器在赋值时复制对象。这通常用于如NSString
、NSArray
和NSDictionary
这样的不可变对象,以确保赋值给属性的对象不会被外部修改。strong
(对于 ARC 项目):与retain
类似,但用于自动引用计数(ARC)环境。weak
(对于 ARC 项目):表示一个弱引用,不会增加对象的引用计数。当对象不再被其他强引用持有时,弱引用会自动变为nil
。这通常用于避免循环引用。unsafe_unretained
(对于 ARC 项目):与assign
类似,但不会自动置为nil
当对象被释放。这可能导致野指针,因此应谨慎使用。
-
读写性
readwrite
:属性具有 getter 和 setter 方法。这是默认行为。readonly
:属性只有 getter 方法,没有 setter 方法。这意味着属性只能被读取,不能被修改。
-
自定义 getter 和 setter
getter=name
:自定义 getter 方法的名称。setter=name:
:自定义 setter 方法的名称。
-
其他
class
:声明一个类属性,而不是实例属性。nullable
和nonnull
(在 Xcode 7 及更高版本中可用):用于指定属性是否为可为空类型。null_resettable
(在 Xcode 7.3 及更高版本中可用):当设置为nil
时,属性将被重置为其原始值或默认值。
这些属性关键字可以根据需要组合使用,以定义属性的具体行为。例如:
@property (nonatomic, strong) NSString *name;
在这个例子中,name
属性是一个非原子的强引用 NSString
对象。