有可以直接从imp获得sel 的方法吗
时间: 2024-03-18 14:42:28 浏览: 14
是的,可以使用 `sel_registerName` 函数将一个 C 字符串转换为一个 `SEL` 类型的选择器,然后通过 `method_getName` 函数将 `Method` 类型的方法转换为 `SEL` 类型的选择器。
具体的实现方式如下:
```objective-c
- (void)testMethod {
IMP imp = [self methodForSelector:@selector(testMethod)];
Method method = class_getInstanceMethod([self class], @selector(testMethod));
SEL sel = method_getName(method);
NSLog(@"SEL为:%s", sel_getName(sel));
}
```
需要注意的是,如果 `IMP` 指向的函数与给定的 `SEL` 选择器不匹配,则可能导致未定义的行为。因此,建议先获取 `Method` 对象,再从中获取 `SEL` 选择器。
相关问题
Objective-C 中怎么通过imp获得sel
可以使用 `method_getName` 函数从 `Method` 对象中获取对应的 `SEL` 选择器,然后通过 `sel_getName` 函数将 `SEL` 类型的选择器转换为 C 字符串。
具体的实现方式如下:
```objective-c
- (void)testMethod {
IMP imp = [self methodForSelector:@selector(testMethod)];
Method method = class_getInstanceMethod([self class], @selector(testMethod));
SEL sel = method_getName(method);
const char *selName = sel_getName(sel);
NSLog(@"SEL为:%s", selName);
}
```
需要注意的是,如果 `IMP` 指向的函数与给定的 `SEL` 选择器不匹配,则可能导致未定义的行为。因此,建议先获取 `Method` 对象,再从中获取 `SEL` 选择器。
Objective-C 中 通过imp获取sel
在 Objective-C 中,可以通过 `imp_implementationWithBlock` 函数将一个 Block 转换成 IMP,进而通过 `class_replaceMethod` 函数将该 IMP 绑定到一个指定的 SEL 上,从而实现动态替换方法实现的效果。
具体的代码示例如下:
```objective-c
// 定义一个 Block
id (^myBlock)(id, SEL, NSString *) = ^(id self, SEL _cmd, NSString *arg) {
NSLog(@"Hello, %@", arg);
return nil;
};
// 将该 Block 转换成 IMP
IMP myImp = imp_implementationWithBlock(myBlock);
// 将该 IMP 绑定到一个指定的 SEL 上
class_replaceMethod([MyClass class], @selector(myMethod:), myImp, "@@:@");
```
上述代码将 `myBlock` 转换成 IMP,并将其绑定到 `MyClass` 类的 `myMethod:` 方法上,实现了动态替换方法实现的效果。