gpt4 book ai didi

iphone - 如何使用 ivar_getTypeEncoding 和 @encode 动态确定和比较对象 ivar 的类型?

转载 作者:可可西里 更新时间:2023-11-01 05:38:17 24 4
gpt4 key购买 nike

这是我想做的比较操作:

// 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() 不同?有没有更好的方法来完成这种类型确定?我一定在这里遗漏了什么......谢谢!

最佳答案

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

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

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

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

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

代码中的一个问题是您获得的是 NSDate 类的类型编码,而不是 NSDate 对象的类型编码。因此,与其比较@encode(NSDate),不如比较@encode(NSDate *)。

要查看这种类型的代码,请查看 Adium's code例如。

关于iphone - 如何使用 ivar_getTypeEncoding 和 @encode 动态确定和比较对象 ivar 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10157912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com