返回
OC底层:无处不在的runtime,深入浅出探究它的秘密
IOS
2024-01-28 07:17:11
OC底层那些事儿:无处不在的runtime
无处不在的runtime
Objective-C的runtime无处不在,它赋予了Objective-C强大的动态性。从Category到Method Swizzling,再到动态绑定,runtime的身影始终相伴。
Category
Category是一种OC中独特的机制,它允许我们在不修改原始类源代码的情况下,为类添加新的方法和属性。这使得我们可以灵活地扩展类,而无需担心修改原始代码的潜在风险。
// 创建一个Category
@interface NSString (MyCategory)
- (BOOL)myContainsString:(NSString *)str;
@end
// 实现Category中的方法
@implementation NSString (MyCategory)
- (BOOL)myContainsString:(NSString *)str {
return [self containsString:str];
}
@end
Method Swizzling
Method Swizzling是一种高级runtime技术,它允许我们在运行时交换两个方法的实现。这在某些情况下非常有用,例如,当我们需要hook系统方法或实现AOP(面向切面编程)时。
// Swizzle两个方法的实现
Method origMethod = class_getInstanceMethod(class, origSelector);
Method newMethod = class_getInstanceMethod(class, newSelector);
method_exchangeImplementations(origMethod, newMethod);
动态绑定
动态绑定是OC runtime的另一个重要特性。它允许我们在运行时确定一个方法的实际实现。这在多态和面向对象编程中至关重要。
// 动态绑定示例
id obj = [[NSObject alloc] init];
[obj performSelector:@selector(method1)]; // 调用父类的方法
[obj performSelector:@selector(method2)]; // 调用子类的方法
结语
OC的runtime为开发者提供了强大的工具,使我们能够创建灵活、可扩展和强大的应用程序。通过深入理解Category、Method Swizzling和动态绑定等技术,我们可以充分利用runtime的优势,编写出更高效、更优雅的代码。