runtime使用

2023-06-16  本文已影响0人  林希品

Objective-C Runtime是iOS开发中非常强大和灵活的工具,它提供了一组C语言接口,用于在运行时进行类和对象的操作。以下是一些Objective-C Runtime的使用场景和示例:

1.动态创建类和对象:

Class newClass = objc_allocateClassPair([NSObject class], "NewClass", 0);
class_addMethod(newClass, @selector(dynamicMethod), (IMP)dynamicMethodImplementation, "v@:");
objc_registerClassPair(newClass);

id newObject = [[newClass alloc] init];

2.方法交换:

Method originalMethod = class_getInstanceMethod([MyClass class], @selector(originalMethod));
Method swizzledMethod = class_getInstanceMethod([MyClass class], @selector(swizzledMethod));
method_exchangeImplementations(originalMethod, swizzledMethod);

3.动态添加属性:

objc_setAssociatedObject(myObject, @"key", associatedObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
id associatedObject = objc_getAssociatedObject(myObject, @"key");

4.方法调用:

[myObject performSelector:@selector(someMethod)];

5.动态获取和修改对象的属性值:

id propertyValue = [myObject valueForKey:@"propertyName"];
[myObject setValue:newValue forKey:@"propertyName"];

6.动态获取和修改类的属性和方法:

objc_property_t property = class_getProperty([MyClass class], "propertyName");
Method method = class_getInstanceMethod([MyClass class], @selector(someMethod));

7.消息发送与动态方法解析:

[myObject performSelector:@selector(nonexistentMethod)];

8.获取类的成员变量:

Ivar ivar = class_getInstanceVariable([MyClass class], "variableName");

9.创建类并添加方法:

#import <objc/runtime.h>

// 定义一个新的类
Class newClass = objc_allocateClassPair([NSObject class], "NewClass", 0);

// 添加一个方法实现
void dynamicMethod(id self, SEL _cmd) {
    NSLog(@"Dynamic method implementation");
}

// 获取方法选择器
SEL dynamicMethodSelector = @selector(dynamicMethod);

// 添加方法到类中
class_addMethod(newClass, dynamicMethodSelector, (IMP)dynamicMethod, "v@:");

// 注册类
objc_registerClassPair(newClass);

// 创建对象并调用动态方法
id newObject = [[newClass alloc] init];
[newObject performSelector:dynamicMethodSelector];

10.交换方法实现:

#import <objc/runtime.h>

// 获取要交换的原始方法和目标方法
Method originalMethod = class_getInstanceMethod([MyClass class], @selector(originalMethod));
Method swizzledMethod = class_getInstanceMethod([MyClass class], @selector(swizzledMethod));

// 交换方法实现
method_exchangeImplementations(originalMethod, swizzledMethod);

11.动态操作属性:

#import <objc/runtime.h>

// 添加关联对象
objc_setAssociatedObject(myObject, @"key", associatedObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

// 获取关联对象
id associatedObject = objc_getAssociatedObject(myObject, @"key");

12.发送消息:

#import <objc/message.h>

// 发送消息给对象
id result = objc_msgSend(myObject, @selector(someMethod));
上一篇 下一篇

猜你喜欢

热点阅读