使用clang和objective-c我想知道我是否可以获得一个描述潜在空参数类型的可打印字符串(即只编译时间类型信息。)
例如:
- (void)myFunc:(NSString *)aNilString {
NSLog(@"%s", __typeof__(aNilString));
}
显然这不起作用,因为__typeof__获取实际类型,而不是字符串。在C ++中,我们有一个返回std :: type_info的typeid,但是该名称被修改,例如" P12NSString *"而不是" NSString *"。
理想情况下,我喜欢可以传递给objc_getClass()等函数的东西。有没有办法得到我想要的东西?
编辑:我不想编译为C ++,所以这个解决方案已经出来了:
abi::__cxa_demangle(typeid(*aNilString).name(), 0, 0, 0));
答案 0 :(得分:0)
要获取可以传递给objc_getClass()等函数的字符串,只需使用类对象的描述即可。
在此示例中,我将您的参数类型从NSString *
更改为id
,因为如果您已经知道参数是NSString *
,那么这个问题就没有实际意义了。请注意,我调用传入的对象的class
方法,然后调用类的description
方法,以获得描述类的NSString *
并可以与方法一起使用你引用的。
另请注意,如果对象为nil
,则表示没有课程,调用description
只会返回nil而NSLog
会打印(null)
。您无法在运行时确定指针的类型,因为它只是指向类对象的指针(nil
不存在)。
- (void)myFunc:(id)aClassObject {
// Get the description of aClassObject's class:
NSString *classString = [[aClassObject class] description];
NSLog(@"%@", classString); // Prints __NSCFConstantString
// Bonus: Get a new object of the same class
if ([classString length] > 0) {
id theClass = objc_getClass([classString UTF8String]);
id aNewObjectOfTheSameType = [[theClass alloc] init];
NSLog(@"%@", [[aNewObjectOfTheSameType class] description]); // Prints __NSCFConstantString
}
}