问题有关isKindOfClass
请看看这段代码剪断问题有关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 :-)
返回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)
那是因为FlyNetArrayOfDataSet
是SoapArray
和SoapArray
是不一个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
- 子类。
请参阅我的问题 – RedPaladin
的EDIT2试试'SoapArray * a = [self array];' – justin
有了父类,你的意思是对象的类还是超类?你不应该子类NSArray。 – 2011-09-06 21:22:34
给出一个你调用这个方法的例子。只是因为方法想要某种类型的对象并不意味着这是你给出的类型。 – PengOne
WTP说的是正确的,永远不会从类集群中分类出来。它会导致痛苦和不稳定的软件。 – JustSid