«isMemberOfClass» возвращает «НЕТ» при пользовательской инициализации

Возможный дубликат:
isMemberOfClass возвращает нет, когда экземпляр ViewController создается из UIStoryboard

Недавно я наткнулся на странную проблему:

Я реализовывал простые тестовые примеры и использовал метод NSObject isMemberOfClass для проверки равенства классов.

Кроме того, я реализовал пользовательскую инициализацию:

-(id)initWithMessage:(NSString *)message

Если я заменю id на правильное имя класса, isMemberOfClass вернет «ДА». В противном случае он потерпит неудачу.

Интересная часть: метод класса будет каждый раз возвращать правильный класс.

Это ошибка? Или это должно так работать?

Спасибо..

РЕДАКТИРОВАТЬ:

Хорошо, это не решило проблему. Вот что я делаю. isMemberOfClass всегда будет возвращать НЕТ

Прецедент:

- (void)test010_broadcastWait
{
    ...
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData
                                                           options:0 error:&error];
    Brick *newBrick = [self.parser loadBroadcastWaitBrick:doc.rootElement];
    if (![newBrick isMemberOfClass:[BroadcastWaitBrick class]])
        STFail(@"Wrong class-member");
    ....
}

Класс BroadCastWait:

импортировать "BroadcastWaitBrick.h"

@implementation BroadcastWaitBrick

-(id)initWithMessage:(NSString *)message
{
    self = [super init];
    if (self)
    {
        self.message = message;
    }
    return self;
}

...

Метод загрузки:

-(BroadcastWaitBrick*)loadBroadcastWaitBrick:(GDataXMLElement*)gDataXMLElement
{


    NSArray *messages = [gDataXMLElement elementsForName:@"broadcastMessage"];
    GDataXMLElement *message = (GDataXMLElement*)[messages objectAtIndex:0];

    BroadcastWaitBrick* brick = [[BroadcastWaitBrick alloc]initWithMessage:message.stringValue];

    return brick;
}

person dominik    schedule 02.10.2012    source источник
comment
На это невозможно ответить без дополнительного кода. Пожалуйста, добавьте фактический код, который вы используете.   -  person jrturton    schedule 02.10.2012
comment
Спасибо за быстрый ответ - я добавил фрагменты кода..   -  person dominik    schedule 02.10.2012
comment
Не могли бы вы объяснить связь между классами Brick и BroadcastWaitBrick?   -  person Tomasz Wojtkowiak    schedule 02.10.2012
comment
BroadCastWaitBrick происходит от Brick... @interface BroadcastWaitBrick : Brick   -  person dominik    schedule 02.10.2012
comment
Это та же проблема, что и isMemberOfClass возвращает no, когда экземпляр ViewController создается из UIРаскадровка; у вас есть класс, загружаемый дважды, один в вашем тестовом коде и один в вашем основном коде. Это приводит к неудачному сравнению двух классов, которые должны быть одинаковыми.   -  person jscs    schedule 02.10.2012
comment
Кроме того, пожалуйста, не принимайте ответы, которые не решают проблему для вас. Вы можете опубликовать собственное решение.   -  person jscs    schedule 02.10.2012


Ответы (1)


isMemberOfClass в вашем тестовом примере возвращает NO, потому что вы объявляете переменную newBrick как член класса Brick.

В этом случае лучше использовать метод isKindOfClass или объявить newBrick как id.

person Tomasz Wojtkowiak    schedule 02.10.2012
comment
Странно то, что этот тест работает каждый раз (например, BroadcastBrick - (одна и та же реализация (разница в имени класса)) но не работает с BroadCastWaitBrick... Изменение его на id тоже не помогает.. - person dominik; 02.10.2012
comment
Я думаю, что разница заключается в определении var, которое вы тестируете. В вашем коде все в порядке, но когда вы создаете объект класса Brick как Brick *newBrick = [[BroadcastWaitBrick alloc] init], в результате вы получаете объект класса Brick. - person Tomasz Wojtkowiak; 02.10.2012
comment
Хорошо, я попытался определить newBrick как BroadCastWaitBrick, но интересно то, что это тоже не работает: P - person dominik; 02.10.2012
comment
Решение найдено. Даже жестко, я этого не понимаю: я добавил BroadCastWaitBrick в BuildPhases моего TestTarget.. BroadCastBrick не был добавлен... Если я удалю waitBrick из тестовой цели, это сработает.. Каков правильный подход?? - person dominik; 02.10.2012
comment
Переменная, содержащая указатель объекта, абсолютно не влияет на успех или неудачу isMemberOfClass: или isKindOfClass:. Информация о типе исчезает во время выполнения, когда эти методы имеют место. Тест производится динамически, на реальном объекте. Это фундаментальная часть ObjC. - person jscs; 02.10.2012