2011-09-06 97 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