lLRuntime 使用方法
时间: 2024-05-15 11:19:21 浏览: 13
LLRuntime 是 iOS 开发中常用的一个运行时库,可以在运行时动态地获取和修改对象的属性、方法等信息,常用于实现方法交换、动态添加方法等功能。下面是 LLRuntime 的使用方法:
1. 导入 LLRuntime 库
在 Xcode 中,可以使用 CocoaPods 导入 LLRuntime 库,也可以手动导入。手动导入的方式是:
将 LLRuntime 文件夹拖入项目中,勾选“Copy items if needed”。
在 Build Phases 中的 Link Binary With Libraries 中添加 libLLRuntime.a。
2. 使用 LLRuntime
2.1 获取类的信息
获取类的信息可以使用以下方法:
```objc
Class cls = [NSObject class];
// 获取类名
const char *name = class_getName(cls);
NSLog(@"class name: %s", name);
// 获取父类
Class superCls = class_getSuperclass(cls);
NSLog(@"super class name: %s", class_getName(superCls));
// 获取实例变量
unsigned int ivarCount;
Ivar *ivarList = class_copyIvarList(cls, &ivarCount);
for (unsigned int i = 0; i < ivarCount; i++) {
Ivar ivar = ivarList[i];
const char *ivarName = ivar_getName(ivar);
const char *ivarType = ivar_getTypeEncoding(ivar);
NSLog(@"ivar name: %s, type: %s", ivarName, ivarType);
}
free(ivarList);
// 获取属性
unsigned int propertyCount;
objc_property_t *propertyList = class_copyPropertyList(cls, &propertyCount);
for (unsigned int i = 0; i < propertyCount; i++) {
objc_property_t property = propertyList[i];
const char *propertyName = property_getName(property);
const char *propertyAttributes = property_getAttributes(property);
NSLog(@"property name: %s, attributes: %s", propertyName, propertyAttributes);
}
free(propertyList);
// 获取方法
unsigned int methodCount;
Method *methodList = class_copyMethodList(cls, &methodCount);
for (unsigned int i = 0; i < methodCount; i++) {
Method method = methodList[i];
SEL methodName = method_getName(method);
const char *methodType = method_getTypeEncoding(method);
NSLog(@"method name: %@, type: %s", NSStringFromSelector(methodName), methodType);
}
free(methodList);
```
2.2 方法交换
方法交换可以使用以下方法:
```objc
@implementation NSObject (LLRuntime)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class cls = [self class];
SEL originalSEL = @selector(description);
SEL swizzledSEL = @selector(ll_description);
Method originalMethod = class_getInstanceMethod(cls, originalSEL);
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSEL);
BOOL didAddMethod = class_addMethod(cls, originalSEL, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(cls, swizzledSEL, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
- (NSString *)ll_description {
NSString *description = [self ll_description];
return [NSString stringWithFormat:@"<%@: %p, desc: %@>", NSStringFromClass([self class]), self, description];
}
@end
```
2.3 动态添加方法
动态添加方法可以使用以下方法:
```objc
@implementation NSObject (LLRuntime)
- (void)ll_setName:(NSString *)name {
objc_setAssociatedObject(self, @selector(ll_name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)ll_name {
return objc_getAssociatedObject(self, _cmd);
}
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(ll_name)) {
class_addMethod([self class], sel, (IMP)ll_name, "@@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
@end
```
以上就是 LLRuntime 的使用方法,可以根据实际需求选择使用。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![csv](https://img-home.csdnimg.cn/images/20210720083646.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![exe](https://img-home.csdnimg.cn/images/20210720083343.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)