目标C:如何比较基元类型和对象

时间:2012-03-02 23:41:10

标签: objective-c primitive

我正在尝试编写一个比较2个对象的方法。我遇到的问题是:我如何知道原始类型的属性?

+(BOOL)isObject:(void*)object1 equalTo:(void*)object2
{
if (object1 == nil && object2 == nil)
    return TRUE;

if ((object1 != nil && object2 == nil) ||
    (object1 == nil && object2 != nil) || 
    ([object1 class] != [object2 class]))
    return FALSE;

if (object1 != object2)
{
    u_int count;
    Ivar* ivars = class_copyIvarList([object1 class], &count);
    for (int i=0; i < count; i++)
    {
        id v1 = object_getIvar(object1, ivars[i]);
        id v2 = object_getIvar(object2, ivars[i]);
        if (![ObjectComparer isObject:v1 equalTo:v2])
            return FALSE;
    }
}
return TRUE;    
} 

这将适用于对象但对基本类型失败。另一件事是我想传递参数作为一般的东西,如id,但不适用于基元。至少我需要知道它是一个原始类型并将其转换为id。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

严格回答属性(如class_copyPropertyList),而不是实例变量(根据当前代码的class_copyIvarList)...

人们通常会使用键值编码来避开这个问题。如果使用valueForKey:,则运行时会自动将基元提升为对象类型。

如果要在Objective-C级别实现它,则使用NSMethodSignature获取-methodSignatureForSelector:并检查methodReturnType属性,该属性属于标准Objective-C类型编码形式(即匹配@encode)。

直接使用C运行时,我想你会在getter上使用method_copyReturnType

对于实例变量,我不确定是否有办法查询其类型。

另请注意,处理此问题的常规方法是让对象自己实现isEqual:。它是NSObject的一部分,因此保证始终被定义。类本身应该实现按值执行比较所需的逻辑。