【问题标题】:Objective C: how to compare primitive types with objectsObjective C:如何比较原始类型和对象
【发布时间】:2012-03-02 23:41:10
【问题描述】:

我正在尝试编写一个比较 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。

有什么想法吗?

【问题讨论】:

  • 为什么不使用所有对象都有的isEqual: 方法(或isEqualToString:NSString 类型的相关方法)?或者,更具体地说,这种方法的目的和最终目标是什么?

标签: objective-c primitive


【解决方案1】:

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

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

如果你要在 Objective-C 级别实现它,你会得到 NSMethodSignature 使用 -methodSignatureForSelector: 并检查 methodReturnType 属性,它是标准的 Objective-C 类型编码形式(即,匹配@encode)。

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

至于实例变量,我不确定是否有办法查询它们的类型。

另请注意,处理此问题的正常方法是让对象本身实现isEqual:。它是NSObject 的一部分,所以保证总是被定义。类本身应实现按值进行比较所需的逻辑。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多