返回

OC底层:无处不在的runtime,深入浅出探究它的秘密

IOS

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的优势,编写出更高效、更优雅的代码。