我正在尝试编写一个比较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。
有什么想法吗?
答案 0 :(得分:1)
严格回答属性(如class_copyPropertyList
),而不是实例变量(根据当前代码的class_copyIvarList
)...
人们通常会使用键值编码来避开这个问题。如果使用valueForKey:
,则运行时会自动将基元提升为对象类型。
如果要在Objective-C级别实现它,则使用NSMethodSignature
获取-methodSignatureForSelector:
并检查methodReturnType
属性,该属性属于标准Objective-C类型编码形式(即匹配@encode
)。
直接使用C运行时,我想你会在getter上使用method_copyReturnType
。
对于实例变量,我不确定是否有办法查询其类型。
另请注意,处理此问题的常规方法是让对象自己实现isEqual:
。它是NSObject
的一部分,因此保证始终被定义。类本身应该实现按值执行比较所需的逻辑。