objective-c - Objective-C : how to compare primitive types with objects

标签 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。

有什么想法吗?

最佳答案

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

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

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

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

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

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

关于objective-c - Objective-C : how to compare primitive types with objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9541908/

相关文章:

ios - 从 UIView 使用 presentViewController

java - 我如何在类中包含(常量)原始数据表?

Java - 赋值之前的基本类型值

java - 有界基元

iphone - 如果键以 @ 符号开头,则在 NSDictionary 上使用 valueForKeyPath?

objective-c - 如何让NSView的背景图片不重复?

iPhone/Objective-C - 更改默认 "navigationItem.prompt"颜色

java - 在 Hibernate 中使用原语或包装类?

objective-c - 有没有办法将对象映射到基元?

ios - 创建可重用的 iOS "views"(如何调整大小?)