跳到主要内容

Object-C @property中有哪些属性关键字?

参考答案:

在 Objective-C 中,@property 指令用于在类接口中声明属性。这些属性可以是实例变量,也可以是类变量(使用 class 关键字)。@property 指令可以包含多个属性关键字,这些关键字定义了属性的行为。以下是一些常见的属性关键字:

  1. 原子性 (Atomicity)

    • atomic:默认属性,保证属性的访问是线程安全的。但是,这并不意味着整个对象都是线程安全的,它仅仅保证属性访问的原子性。在多线程环境中,可能需要额外的同步机制。
    • nonatomic:属性的访问不是线程安全的,但访问速度更快。在单线程环境中或已经通过其他方式同步访问的属性中,通常会使用这个关键字。
  2. 内存管理

    • assign:适用于基础数据类型,如 C 的数据类型(int, float, enum, struct 等)。这个关键字告诉编译器直接进行简单的赋值操作。
    • retain(对于非 ARC 项目):对于 Objective-C 对象,这个关键字告诉编译器在赋值时保留对象(即增加其引用计数)。
    • copy:对于 Objective-C 对象,这个关键字告诉编译器在赋值时复制对象。这通常用于如 NSStringNSArrayNSDictionary 这样的不可变对象,以确保赋值给属性的对象不会被外部修改。
    • strong(对于 ARC 项目):与 retain 类似,但用于自动引用计数(ARC)环境。
    • weak(对于 ARC 项目):表示一个弱引用,不会增加对象的引用计数。当对象不再被其他强引用持有时,弱引用会自动变为 nil。这通常用于避免循环引用。
    • unsafe_unretained(对于 ARC 项目):与 assign 类似,但不会自动置为 nil 当对象被释放。这可能导致野指针,因此应谨慎使用。
  3. 读写性

    • readwrite:属性具有 getter 和 setter 方法。这是默认行为。
    • readonly:属性只有 getter 方法,没有 setter 方法。这意味着属性只能被读取,不能被修改。
  4. 自定义 getter 和 setter

    • getter=name:自定义 getter 方法的名称。
    • setter=name::自定义 setter 方法的名称。
  5. 其他

    • class:声明一个类属性,而不是实例属性。
    • nullablenonnull(在 Xcode 7 及更高版本中可用):用于指定属性是否为可为空类型。
    • null_resettable(在 Xcode 7.3 及更高版本中可用):当设置为 nil 时,属性将被重置为其原始值或默认值。

这些属性关键字可以根据需要组合使用,以定义属性的具体行为。例如:

@property (nonatomic, strong) NSString *name;

在这个例子中,name 属性是一个非原子的强引用 NSString 对象。