返回

逐层解密iOS Runtime之属性与成员变量修饰符剖析

IOS

揭秘属性与成员变量修饰符

在iOS Runtime中,属性和成员变量是两种不同的概念。属性是面向对象的编程语言中用来访问成员变量的特殊方法,而成员变量则是类中定义的变量。属性的本质是编译器自动帮我们生成:Ivar + setter + getter

属性和成员变量都可以使用修饰符来控制其访问权限。修饰符可以是publicprivateprotectedinternalfileprivate

  • public修饰符表示属性或成员变量可以在任何地方被访问。
  • private修饰符表示属性或成员变量只能在本类中被访问。
  • protected修饰符表示属性或成员变量只能在本类及其子类中被访问。
  • internal修饰符表示属性或成员变量只能在本模块中被访问。
  • fileprivate修饰符表示属性或成员变量只能在本源文件中被访问。

代码剖析:修饰符在实践中的应用

为了更深入地理解属性和成员变量修饰符的用法,我们以一个实际的代码示例来说明。

首先,我们定义一个LGPerson类,添加一系列如下不同修饰符的属性:

class LGPerson {
    public var name: String
    private var age: Int
    protected var gender: String
    internal var address: String
    fileprivate var phone: String
}

然后,我们在main.m文件中创建一个LGPerson类的实例,并访问其属性:

#import "LGPerson.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        // 创建 LGPerson 类的实例
        LGPerson *person = [[LGPerson alloc] init];
        
        // 访问 public 修饰符的属性
        person.name = @"李四";
        
        // 访问 private 修饰符的属性
        // person.age = 20; // 报错,无法访问 private 修饰符的属性
        
        // 访问 protected 修饰符的属性
        // person.gender = @"男"; // 报错,无法访问 protected 修饰符的属性
        
        // 访问 internal 修饰符的属性
        person.address = @"北京市海淀区";
        
        // 访问 fileprivate 修饰符的属性
        // person.phone = @"18812345678"; // 报错,无法访问 fileprivate 修饰符的属性
    }
    return 0;
}

从代码中可以看出,只有publicinternal修饰符的属性可以在main.m文件中被访问。

结语

属性和成员变量修饰符是iOS Runtime中的重要概念,理解这些修饰符的用法和作用对于编写出安全、可靠的代码非常重要。希望这篇文章能够帮助你更好地理解iOS Runtime中的属性和成员变量修饰符。