2011-09-06 65 views
2

请看看这段代码剪断问题有关isKindOfClass

​​

为什么,当我看到我的控制台上,我得到

2011-09-06 23:08:00.917 soap-test[2133:207] Not Yeah 

我是初学者,我完全糊涂了.. :s当我查看调试器时,变量类型是SoapArray(谁是FlyNetArrayOfDataSet的父类)。

我使用SoapArray中的一个方法来启动我的'datasets'实例,这意味着该类自动定义为Soap而不是FlyNetArrayOfDataSet?!

谢谢

编辑:我犯了一个错误,这不是NSArray的,但它继承SoapArray

这是类FlyNetArrayOfDataSet

#import "Soap.h" 

@interface FlyNetArrayOfDataSet : SoapArray 
{ 
} 

+ (NSMutableString*) serialize: (NSArray*) array; 

@end 

的头文件,但没有解释我为什么KindOfClass返回false ..

编辑2:好吧我有我的问题的回应..

我用这个方法来初始化我的实例

FlyNetArrayOfDataSet * arr = [FlyNetArrayOfDataSet arrayWithObject:data]; 

这是创建SoapArray(助手)的实例超SoapArray的静态方法..但不FlyNetArrayOfDataSet(!)的一个实例

看看它的实现:

+ (id)arrayWithObjects:(id)firstObj, ...{ 
    SoapArray* a = [SoapArray array]; 
    id eachObject; 
    va_list argumentList; 
    if (firstObj) { 
     [a.items addObject: firstObj]; 
     va_start(argumentList, firstObj); 
     while (eachObject = va_arg(argumentList, id)) { 
      [a.items addObject: eachObject]; 
     } 
     va_end(argumentList); 
    } 
    return a; 
} 

如果我初始化我的情况是这样

FlyNetArrayOfDataSet * arr = [[FlyNetArrayOfDataSet alloc] init]; 

这是完美的工作和方法isKindOfClass :-)

+3

有了父类,你的意思是对象的类还是超类?你不应该子类NSArray。 – 2011-09-06 21:22:34

+0

给出一个你调用这个方法的例子。只是因为方法想要某种类型的对象并不意味着这是你给出的类型。 – PengOne

+0

WTP说的是正确的,永远不会从类集群中分类出来。它会导致痛苦和不稳定的软件。 – JustSid

回答

4

返回true,假设你有一个名为“FlyNetArrayOfDataSet”从继承(=是的一个子类)的NSArray类。

如果你像实例变量:

FlyNetArrayOfDataSet *arr = [[FlyNetArrayOfDataSet alloc] init]; 

正如你所看到的,我用初始化的NSArray的方法数组。但是,我的“arr”对象将是FlyNetArrayOfDataSet类型的,而不是NSArray,因为我调用了FlyNetArrayOfDataSet类(请参阅[FlyNetArrayOfDataSet arrayWithObject....)。

NSLog(@"%d", [arr isKindOfClass:[FlyNetArrayOfDataSet class]]); 
NSLog(@"%d", [arr isKindOfClass:[NSArray class]]); 

两者都将返回“1”,意思是“真”时,因为ARR是FlyNetArrayOfDataSet类,它从继承的NSArray的目的。

编辑 让我们来看看,如果我能更好地解释它:

arr1 = [[FlyNetArrayOfDataSet alloc] init]; 
arr2 = [[NSArray alloc] init]; 

这两个对象,ARR1和ARR2,用同样的方法,这是在类NSArray的定义的。但是,在第一种情况下,被调用的类是FlyNetArrayOfDataSet,而第二种情况下是NSArray。因此,arr1将是类FlyNetArrayOfDataSet的对象,而arr2将是类NSArray。

的差异可以看出,在此代码:

NSLog(@"%d %d", 
    [arr1 isKindOfClass:[FlyNetArrayOfDataSet class]] 
    [arr1 isKindOfClass:[NSArray class]] 
); 
NSLog(@"%d %d", 
    [arr2 isKindOfClass:[FlyNetArrayOfDataSet class]] 
    [arr2 isKindOfClass:[NSArray class]] 
); 

这段代码的输出是:

1 1 (= true true) 
0 1 (= false true) 
+0

取决于NSArray如何在'arrayWithObject'方法中创建对象! – Macmade

+0

这对我来说一直很有用,至少在系统框架中有类。他看起来已经很困惑,用这些边缘案例打扰他,与基础班工作时不重要:) – Qualcuno

+2

这实际上不起作用。你必须重写'initWithObjects:count:',因为'arrayWithObject:'调用它,它只是为抽象类定义('NSArray'会抛出异常)。作为一个类集群,无论如何,对NSArray进行子类化通常是一个坏主意,特别是对于初学者。 – omz

0

那是因为FlyNetArrayOfDataSetSoapArraySoapArray一个FlyNetArrayOfDataSet

如果datasets是的SoapArray一个实例,你会看到“肥皂”,在下面的例子:

- (SoapRequest*)addFlyData:(id)target 
        action:(SEL)action 
       sessionid:(int)sessionid 
        datasets:(FlyNetArrayOfDataSet*)datasets 
{ 
    if ([datasets isKindOfClass:[FlyNetArrayOfDataSet class]]) { 
     NSLog(@"Fly"); 
    } 
    else if ([datasets isKindOfClass:[SoapArray class]]) { 
     NSLog(@"Soap"); 
    } 
    else { 
     NSLog(@"???"); 
    } 
} 

它可能是的SoapArray的实例也是FlyNetArrayOfDataSet。另一可能性是:

  • FlyNetArrayOfDataSet以外的SoapArray
  • 子类。
+0

请参阅我的问题 – RedPaladin

+0

的EDIT2试试'SoapArray * a = [self array];' – justin