Пожалуйста, посмотрите на этот код
- (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 ..
РЕДАКТИРОВАТЬ2: Хорошо, у меня есть ответ на мой вопрос ..
Я использовал этот метод для инициализации моего экземпляра
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: -)