我可以在Objective-C中确定对象类型吗?

时间:2014-01-02 20:30:15

标签: objective-c object-type

我有一个数组arry1,它包含两种对象obj1obj2obj2obj1的子类。我写了一个方法来总结value所有出现的obj1,其中包括:

    int total = 0;
    for (obj1 *t in arry1){
        total += t.value;
    }

问题在于它是obj1obj2个项目的总和。如果我将for循环更改为obj2 *t,它也会这样做。所以我有两个问题:

  1. 有没有办法确定for循环中当前实例的实际类?

  2. 有没有办法区分for声明中的两个对象实例?

4 个答案:

答案 0 :(得分:2)

[obj1 isMemberOfClass: [whateverObj1Is class]];

但是对于obj2来说这可能是正确的,因为它是一个子类

一个好的解决方案是使用一个名为value的成员函数或类2将覆盖返回0或其他内容的东西。

答案 1 :(得分:1)

您可以尝试这样的事情:

int total = 0;
for (Obj1 *t in arry1){
    if([t isMemberOfClass:[Obj1 class]]) total += t.value;
}

所有对象都实现了NSObject协议。此代码在该协议中使用两种方法。 isMemberOfClass:检查对象是否是作为参数传递的类。 class方法返回接收者类的类对象。

Source/ more info

另外,如果要检查Obj1类或其任何子类的对象,可以使用isKindOfClass:而不是。

答案 2 :(得分:1)

如果是obj1类,则必须检查每个对象并仅添加其值。

int total = 0;
for (obj1 *t in arry1) {
    if ([t class] == [obj1 class])
        total += t.value;
}

请注意,以大写字母开头的课程名称很常见。同样Obj1将是一个误导性的名称,因为它暗示实例,而不是类。

答案 3 :(得分:0)

您可以使用内省来确定数组中每个对象所属的类。有两种有用的方法可以确定对象的类。 isKindOfClass:isMemberOfClass:isKindOfClass:返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。然而,isMemberOfClass:返回一个布尔值,指示该对象是否是该特定类的成员。

你可以这样做:

int total = 0;
obj1 *myObj1;
for (NSObject *object in arry1)
{
    if([object isMemberOfClass:[obj1 class]])
    { 
        myObj1 = (obj1 *)object;
        total += myObj1.value;
    }
}