返回

打开你编程认知之门的属性 @property

IOS

@property 应该是面试过程中被问到最多的一个技术点,既能考察一个人的基础,又能挖掘一个人对技术细节的掌握度。下面就让我们一起来深入探讨 @property 的方方面面,开启你编程认知之门。

1. @property语法

@property <修饰符> <类型> <变量名>;
  • 修饰符 :可用于修饰 @property 的修饰符包括 nonatomic、atomic、readonly 和 readwrite。nonatomic 表示属性是非原子的,可以被多个线程同时访问;atomic 表示属性是原子的,只能被一个线程访问;readonly 表示属性只能被读取,不能被修改;readwrite 表示属性既可以被读取,也可以被修改。
  • 类型 :属性的类型可以是基本数据类型、对象类型或结构体类型。
  • 变量名 :属性的变量名必须遵守 Objective-C 的命名规则,并且必须与属性的 setter 和 getter 方法的名称一致。

2. @property类型

@property 可以分为两种类型:实例变量和类变量。

  • 实例变量 :实例变量是属于类的实例的变量,每个类的实例都有自己的实例变量。
  • 类变量 :类变量是属于类的变量,所有类的实例共享同一个类变量。

3. @property修饰符

@property 可以使用以下修饰符进行修饰:

  • nonatomic :表示属性是非原子的,可以被多个线程同时访问。
  • atomic :表示属性是原子的,只能被一个线程访问。
  • readonly :表示属性只能被读取,不能被修改。
  • readwrite :表示属性既可以被读取,也可以被修改。
  • assign :表示属性是直接赋值的,不会进行内存管理。
  • strong :表示属性是强引用的,如果属性指向的对象被释放,则属性也会被释放。
  • weak :表示属性是弱引用的,如果属性指向的对象被释放,则属性不会被释放。
  • unsafe_unretained :表示属性是不安全的未保留的,如果属性指向的对象被释放,则属性也会被释放,但不会引发错误。

4. @property实现原理

@property 是一个编译器指令,它会在编译时将属性转换成两个方法:setter 方法和 getter 方法。setter 方法用于设置属性的值,getter 方法用于获取属性的值。

setter 方法和 getter 方法的名称都是固定的,它们都是以属性的名称为前缀,然后加上 set 和 get。例如,如果属性的名称是 name,那么 setter 方法的名称就是 setName,getter 方法的名称就是 getName。

5. @property使用场景

@property 可以用于各种场景,包括:

  • 封装数据 :@property 可以用于封装类的内部数据,从而保护数据的安全和隐私。
  • 实现属性的动态派发 :@property 可以用于实现属性的动态派发,从而允许子类重写父类的属性。
  • 调用 super :@property 可以用于调用 super,从而允许子类访问父类的属性和方法。

结论

@property 是 Objective-C 中一个非常重要的,它可以用于封装数据、实现属性的动态派发、调用 super 等。理解 @property 的含义及背后的实现原理,是一个合格 iOS 开发者必备的能力之一。希望本文能为你提供一些帮助。