揭秘 iOS 底层分析之加载(中):深入探索 ro 和 rw、懒加载与非懒加载、分类本质
2023-11-15 09:17:29
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 平台的功能。
常见问题解答
-
ro 和 rw 属性的区别是什么? ro 属性在类初始化时自动初始化,而 rw 属性需要手动初始化。
-
懒加载的好处是什么? 懒加载可以推迟对象的初始化,直到它们实际需要时,这可以节省内存并提高性能。
-
分类的动态特性有什么好处? 分类可以在运行时添加到类中,允许你根据需要扩展其功能。
-
分类和子类之间的区别是什么? 分类扩展现有类,而子类创建新类。分类是非侵入式的,而子类会继承原始类的所有特性。
-
如何在 Objective-C 中使用分类? 使用 @interface 和 @implementation 块在 Objective-C 中声明和实现分类方法。