返回

揭秘 iOS 底层分析之加载(中):深入探索 ro 和 rw、懒加载与非懒加载、分类本质

IOS

iOS 底层分析:深入了解 ro/rw、懒加载和分类

在 iOS 开发中,深入理解底层机制对于揭开系统的运作方式至关重要。本篇博客将带领你深入探索三个关键概念:ro 和 rw 的初始化、懒加载与非懒加载,以及分类的本质。

探索 ro 和 rw 的初始化

在 Objective-C 中,属性的访问受到 ro 和 rw 修饰符的控制。

  • ro (只读) 属性在类初始化时自动初始化。这意味着它们的值在实例化时就已确定,通常是默认值或 nil。

  • rw (读写) 属性需要在类初始化后手动初始化。可以通过在构造函数中显式设置其值来实现。

class Person {
  @property (nonatomic, readonly) NSString *name;
  @property (nonatomic, readwrite) NSString *address;

  - (instancetype)initWithName:(NSString *)name address:(NSString *)address {
    self = [super init];
    if (self) {
      _name = name;
      _address = address;
    }
    return self;
  }
}

在这个示例中,name 属性是 ro,在初始化时自动设置为 nil,而 address 属性是 rw,需要通过构造函数显式初始化。

懒加载与非懒加载

Swift 中的 lazy 修饰符允许你推迟对象的初始化,直到它们实际需要时。这可以节省内存并提高性能。

  • 懒加载属性 使用 lazy 修饰符声明,并在第一次访问时初始化。
class Person {
  lazy var fullName: String = {
    // 这里执行初始化操作
    return "\(firstName) \(lastName)"
  }()
}
  • 非懒加载属性 在类初始化时立即初始化。
class Person {
  var fullName: String = "\(firstName) \(lastName)"
}

分类本质

分类为现有类添加新功能的强大机制,无需修改原始源代码。

  • 动态: 分类在运行时添加到类中,允许你扩展其功能。
  • 扩展: 分类可以添加新方法和属性,但不能重写现有方法。
  • 非侵入式: 分类不会影响原始类的源代码,使你可以安全地添加新行为。
@interface Person (ExtendedFunctionality)
- (void)greet;
@end

@implementation Person (ExtendedFunctionality)
- (void)greet {
  NSLog(@"Hello, my name is %@", self.name);
}
@end

在这个示例中,Person 的 ExtendedFunctionality 分类添加了一个 greet 方法,而无需修改 Person 类的原始代码。

总结

理解 ro/rw、懒加载和分类等底层概念对于深入理解 iOS 系统至关重要。这些机制为扩展和定制类提供了强大的工具,让你可以优化代码并充分利用 iOS 平台的功能。

常见问题解答

  1. ro 和 rw 属性的区别是什么? ro 属性在类初始化时自动初始化,而 rw 属性需要手动初始化。

  2. 懒加载的好处是什么? 懒加载可以推迟对象的初始化,直到它们实际需要时,这可以节省内存并提高性能。

  3. 分类的动态特性有什么好处? 分类可以在运行时添加到类中,允许你根据需要扩展其功能。

  4. 分类和子类之间的区别是什么? 分类扩展现有类,而子类创建新类。分类是非侵入式的,而子类会继承原始类的所有特性。

  5. 如何在 Objective-C 中使用分类? 使用 @interface 和 @implementation 块在 Objective-C 中声明和实现分类方法。