4

使用clang和objective-c我想知道我是否可以获得一个描述潜在空参数类型的可打印字符串(即仅编译时类型信息。)

例如:

- (void)myFunc:(NSString *)aNilString {
    NSLog(@"%s", __typeof__(aNilString));
}

显然这不起作用,因为 __typeof__ 让我得到实际类型,而不是字符串。在 C++ 中,我们有 typeid,它返回一个 std::type_info,但该名称被破坏,例如“P12NSString*”而不是“NSString*”。

理想情况下,我想要一些可以传递给 objc_getClass() 之类的函数的东西。有没有办法得到我想要的?

编辑:我不想编译为 C++,所以这个解决方案出来了:

abi::__cxa_demangle(typeid(*aNilString).name(), 0, 0, 0));
4

1 回答 1

0

要获取可以传递给 objc_getClass() 之类的函数的字符串,只需使用类对象的描述即可。

在这个例子中,我把你的论点的类型从NSString *改为 ,id因为如果你已经知道这个论点是 anNSString *那么这个问题就没有实际意义了。请注意,我调用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
    }
}
于 2013-07-27T02:11:20.037 回答