【发布时间】:2011-09-06 21:16:54
【问题描述】:
请看这段代码被剪断
- (SoapRequest*)AddFlyData:(id)_target
action:(SEL)_action
sessionid:(int)sessionid
datasets:(FlyNetArrayOfDataSet*)datasets
{
if ([datasets isKindOfClass:[FlyNetArrayOfDataSet class]]) {
NSLog(@"Yeah");
} else {
NSLog(@"Not Yeah");
}
}
为什么,当我查看控制台时,我得到了
2011-09-06 23:08:00.917 soap-test[2133:207] Not Yeah
我是一个初学者,我完全糊涂了.. :s 当我查看调试器时,变量类型是 SoapArray(它是 FlyNetArrayOfDataSet 的父类)。
我使用 SoapArray 中的一个方法来启动我的“数据集”实例,这意味着该类被自动定义为 Soap 而不是 FlyNetArrayOfDataSet?!
谢谢
编辑:我犯了一个错误,它不是 NSArray 而是继承自 SoapArray
这是 FlyNetArrayOfDataSet 类的头文件
#import "Soap.h"
@interface FlyNetArrayOfDataSet : SoapArray
{
}
+ (NSMutableString*) serialize: (NSArray*) array;
@end
但这并不能解释为什么 isKindOfClass 返回 false ..
EDIT2:好的,我已经回答了我的问题..
我用这个方法来初始化我的实例
FlyNetArrayOfDataSet * arr = [FlyNetArrayOfDataSet arrayWithObject:data];
这是超类 SoapArray 的静态方法,它创建 SoapArray (Helper) 的实例 .. 但不是 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 :-)
【问题讨论】:
-
父类是指对象的类,还是超类?你不应该继承 NSArray。
-
举一个你调用这个方法的例子。仅仅因为该方法需要某种类型的对象并不意味着这就是您给它的类型。
-
WTP 说的是对的,永远不会从类集群中继承。它会导致痛苦和软件不稳定。
标签: objective-c