Objective-C 中 通过imp获取sel
时间: 2024-03-17 12:47:13 浏览: 16
在 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:` 方法上,实现了动态替换方法实现的效果。
相关问题
Objective-C 中 通过imp获取函数名
在 Objective-C 中,IMP 是一个指向方法实现的函数指针,其实现的函数名可以通过 `method_getName` 函数获取。
具体的代码示例如下:
```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 mySelector = method_getName(class_getInstanceMethod([NSObject class], myImp));
const char *myFunctionName = sel_getName(mySelector);
NSLog(@"My function name is %s", myFunctionName);
```
上述代码将 `myBlock` 转换成 IMP,并通过 `method_getName` 函数获取其函数名,最后通过 `sel_getName` 函数将其转换为 C 字符串输出。
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` 选择器。