MST

星途 面试题库

面试题:Objective-C中属性(Property)的修饰符有哪些,以及nonatomic的作用是什么

请详细列举Objective-C中属性(Property)常见的修饰符,并重点阐述nonatomic修饰符在多线程环境下对属性访问的影响。
38.4万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

常见修饰符

  1. 原子性(atomicity)
    • atomic:默认修饰符,为属性的存取方法生成线程安全的代码,保证同一时间只有一个线程能访问该属性。在多线程环境下,通过锁机制确保属性访问的完整性。
    • nonatomic:不提供线程安全保障,在多线程环境下,可能出现多个线程同时访问属性的情况,会导致数据竞争和不一致。但由于没有锁的开销,其访问速度比atomic快。
  2. 读写权限(read - writeability)
    • readwrite:默认修饰符,同时生成属性的gettersetter方法,允许读取和写入属性值。
    • readonly:只生成getter方法,属性只能读取,不能写入,常用于一些只需要对外提供读取功能的属性。
  3. 内存管理(memory management)
    • assign:用于基本数据类型(如intfloatdouble等),简单赋值,不涉及引用计数的管理。当对象被释放时,不会自动处理与之关联的属性。
    • retain:用于对象类型,会增加对象的引用计数。当设置属性值时,先释放旧值(如果有),再对新值进行retain操作。在ARC环境下已不推荐使用。
    • strong:ARC环境下等同于retain,表示对对象的强引用,持有对象,使其引用计数加1。当强引用计数变为0时,对象被释放。
    • weak:用于对象类型,建立弱引用,不会增加对象的引用计数。当对象被释放时,指向该对象的弱引用会自动被设置为nil,从而避免野指针。常用于解决循环引用问题,如视图控制器之间的父子关系。
    • unsafe_unretained:类似于weak,但当对象被释放时,指向它的指针不会被自动设为nil,可能导致野指针,一般较少使用。
  4. 方法名(method naming)
    • getter = customGetter:指定自定义的getter方法名。例如,@property (nonatomic, getter = isFinished) BOOL finished;,此时访问属性使用isFinished方法。
    • setter = customSetter::指定自定义的setter方法名。例如,@property (nonatomic, setter = setTotalCount:) NSInteger totalCount;,设置属性值时使用setTotalCount:方法。

nonatomic在多线程环境下对属性访问的影响

在多线程环境中,nonatomic修饰的属性由于没有线程安全保护机制,多个线程可能同时访问和修改该属性。这可能导致数据竞争问题,例如一个线程正在读取属性值,另一个线程同时修改了该值,使得读取到的数据不一致。此外,如果属性是对象类型且涉及复杂的操作(如对NSMutableArray进行添加和删除元素操作),nonatomic可能导致数据损坏。然而,由于nonatomic没有锁的开销,在单线程环境或对线程安全要求不高的场景下,能提高属性访问的性能。