Objective-C 中 通过imp获取函数名
时间: 2024-03-17 11:47:14 浏览: 31
在 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
在 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中,可以通过`class_getName`函数获取一个类的名称,但是无法通过`imp`获取函数的类名。`imp`是一个指向函数实现的指针,它不包含有关函数所属类的信息。如果你想知道一个函数所属的类名,你需要手动记录或者在函数中传入该类的名称作为参数。例如,在函数实现中可以使用`NSStringFromClass`函数获取当前函数所属的类名,然后进行记录或传递。例如:
```objective-c
- (void)myMethod {
NSString *className = NSStringFromClass([self class]);
// do something with className
}
```
需要注意的是,如果你打算在函数实现中获取当前类的名称,那么需要在类的定义中使用`@implementation`关键字来实现该类,否则`class`方法将无法获取到该类的名称。