Objective-C 中通过类名获取文件名
时间: 2024-03-24 08:42:02 浏览: 30
在Objective-C中,可以通过NSString的方法stringWithCString:encoding:将类名转换为字符串,然后使用NSBundle的方法pathForResource:ofType:获取文件名。
以下是一个示例代码:
```
NSString *className = NSStringFromClass([MyClass class]);
NSString *fileName = [[NSBundle mainBundle] pathForResource:className ofType:@"m"];
```
在这个示例中,我们首先使用NSStringFromClass方法获取类名,然后使用NSBundle的pathForResource:ofType:方法获取文件路径。在这里,我们指定了文件类型为”m”,以获取.m文件的路径。如果是获取.h文件的路径,则需要指定文件类型为”h”。
需要注意的是,获取文件名的路径需要在正确的Bundle中进行。在上面的示例中,我们使用了mainBundle,也就是当前应用程序的Bundle。如果需要在其他Bundle中获取文件名,则需要使用对应的NSBundle对象。
相关问题
还有其他办法在Objective-C 中通过类名获取文件名
除了使用NSBundle的pathForResource:ofType:方法之外,还有其他几种方法可以在Objective-C中通过类名获取文件名。
1. 使用NSString的方法stringByAppendingString:将类名与文件类型拼接起来,然后使用NSFileManager的方法fileExistsAtPath:判断文件是否存在。
```
NSString *className = NSStringFromClass([MyClass class]);
NSString *filePath = [[NSBundle mainBundle] resourcePath];
NSString *fileName = [className stringByAppendingString:@".m"];
NSString *fullPath = [filePath stringByAppendingPathComponent:fileName];
if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) {
// 文件存在
}
```
在这个示例中,我们首先获取类名,然后使用NSBundle的resourcePath方法获取资源路径,然后将类名与文件类型拼接起来,得到完整的文件名。最后,使用NSFileManager的fileExistsAtPath方法判断文件是否存在。
2. 使用C函数objc_getClass和class_getName获取类名,然后使用C函数dlopen和dlsym获取文件名。
```
#include <dlfcn.h>
#import <objc/runtime.h>
Class class = objc_getClass("MyClass");
const char *className = class_getName(class);
void *handle = dlopen(NULL, RTLD_NOW);
const char *fileName = dlsym(handle, className);
```
在这个示例中,我们首先使用objc_getClass和class_getName函数获取类名,然后使用dlopen和dlsym函数获取文件名。需要注意的是,dlopen和dlsym函数需要传入正确的动态链接库文件路径,否则会出现错误。
总的来说,虽然可以使用多种方法在Objective-C中通过类名获取文件名,但是使用NSBundle的pathForResource:ofType:方法是最常用的方法,也是最简单的方法。
Objective-C 中有宏可以获取当前类名吗
在Objective-C中,可以使用`NSStringFromClass`宏来获取当前类名。该宏定义在`objc/runtime.h`头文件中,其函数原型如下:
```objective-c
NSString *NSStringFromClass(Class aClass);
```
该宏接收一个`Class`类型的参数,返回一个`NSString`类型的类名。例如,在一个类的方法中,可以使用以下代码获取当前类的类名:
```objective-c
NSString *className = NSStringFromClass([self class]);
NSLog(@"Class name: %@", className);
```
需要注意的是,如果要在C函数中获取当前类的类名,可以使用Objective-C Runtime提供的`object_getClassName`函数来获取对象的类名,例如:
```objective-c
#include <objc/runtime.h>
const char *className = object_getClassName(self);
NSLog(@"Class name: %s", className);
```
这里的`self`是当前对象的指针。`object_getClassName`函数返回一个`const char *`类型的指针,指向对象的类名。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)