Вопрос про isKindOfClass - PullRequest
       3

Вопрос про isKindOfClass

2 голосов
/ 07 сентября 2011

Пожалуйста, посмотрите на этот код

- (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: -)

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Предположим, у вас есть класс с именем "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", что означает "true"", поскольку arr является объектом класса FlyNetArrayOfDataSet, который наследуется от NSArray.

EDIT Давайте посмотрим, смогу ли я объяснить это лучше:

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 голосов
/ 07 сентября 2011

это потому, что FlyNetArrayOfDataSet - это SoapArray, а SoapArray - это , а не a 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.другие возможности:

  • a SoapArray
  • подкласс, отличный от FlyNetArrayOfDataSet.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...