参数的可打印类型字符串

时间:2013-07-27 00:45:38

标签: objective-c clang

使用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));

1 个答案:

答案 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
    }
}