„isMemberOfClass“ връща „НЕ“ при персонализирано инициализиране

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

Наскоро се натъкнах на странен проблем:

Внедрявах прости тестови случаи и използвах метода NSObject isMemberOfClass, за да проверя за равенство на класовете.

Освен това внедрих персонализиран init:

-(id)initWithMessage:(NSString *)message

Ако заменя id с правилното име на клас, isMemberOfClass ще върне „YES“. В противен случай ще се провали.

Интересната част е: методът клас ще връща правилния клас всеки път.

Това бъг ли е? Или трябва да работи по този начин?

Благодаря..

РЕДАКТИРАНЕ:

Добре, това не реши проблема.. Ето какво правя.. 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;
}

...

loadMethod:

-(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 връща не, когато ViewController се инстанцира от UIStoryboard; класът се зарежда два пъти, един във вашия тестов код и един във вашия основен код. Това води до неуспешно сравнение на двата класа, които трябва да бъдат еднакви.   -  person jscs    schedule 02.10.2012
comment
Освен това, моля, не приемайте отговори, които не решават проблема вместо вас. Можете да публикувате свое собствено решение.   -  person jscs    schedule 02.10.2012


Отговори (1)


isMemberOfClass във вашия тестов случай връща NO, защото декларирате newBrick var като член на класа 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 от Test Target, той работи.. Какъв е правилният подход?? - person dominik; 02.10.2012
comment
Променливата, която държи указател на обект, абсолютно не влияе на успеха или неуспеха на isMemberOfClass: или isKindOfClass:. Информацията за типа изчезва по време на изпълнение, когато се изпълняват тези методи. Тестът се прави динамично, върху реален обект. Това е основна част от ObjC. - person jscs; 02.10.2012