4

这是我想做的比较操作:

// foobar is the name of an ivar on some class
// i.e. NSDate *foobar;
const char *ivarType = [self getTypeForInstanceVariableWithName:@"foobar"];
const char *objType  = @encode(NSDate);

if (strcmp(ivarType, objType) == 0) {
    //set value 
} 

NSLog(@"comparing %s with %s", ivarType, objType);

辅助方法:

- (const char*)getTypeForInstanceVariableWithName:(NSString *)name {
     return ivar_getTypeEncoding(class_getInstanceVariable([self class], [name cStringUsingEncoding:NSUTF8StringEncoding]));
}

NSLog 结果:

comparing @"NSDate" with {NSDate=#}

为什么@encode 返回与 ivar_getTypeEncoding() 不同的类型语法?有没有更好的方法来完成这种类型的确定?我一定在这里遗漏了一些东西......谢谢!

4

1 回答 1

5

使用 ivar_getTypeEncoding() 时,您必须注意第一个字符。让我们看一个例子:

如果你有一个原始类型,第一个 char 将是你得到的全部,对于int它将是 'i',对于char 'c',对于unsigned long long 'Q',等等......

对于对象和类,您可能会得到更多,例如在您的示例中,但第一个字符是您想要的,例如 @ 表示对象,# 表示类,: 表示选择器。

您可以在此处阅读有关这些类型的信息。您还可以在比较时使用常量,例如 _C_ID、_C_CLASS 等。在runtime.h中获取战利品。

C 数组似乎更棘手,但我相信你可以解决这个问题。

您的代码中的一个问题是您正在获取 NSDate 类的类型编码,而不是 NSDate 对象。因此,不要与@encode(NSDate) 进行比较,而是与@encode(NSDate *) 进行比较。

要查看这种类型的代码,请查看Adium 的代码

于 2012-04-15T00:55:52.877 回答