Objective c ';isMemberOfClass';返回';否';当自定义初始化时

Objective c ';isMemberOfClass';返回';否';当自定义初始化时,objective-c,nsobject,Objective C,Nsobject,可能重复: 我最近遇到了一个奇怪的问题: 我正在实现简单的测试用例,并使用NSObject isMemberOfClass方法检查类的相等性 此外,我还实现了一个自定义初始化: -(id)initWithMessage:(NSString *)message 如果我用正确的类名替换id,isMemberOfClass将返回“YES”。否则它将失败 有趣的是:class方法每次都会返回正确的类 这是虫子吗?还是应该这样做 谢谢 编辑: 好的,这并没有解决问题。。我就是这么做的。。isMembe

可能重复:

我最近遇到了一个奇怪的问题:

我正在实现简单的测试用例,并使用NSObject isMemberOfClass方法检查类的相等性

此外,我还实现了一个自定义初始化:

-(id)initWithMessage:(NSString *)message
如果我用正确的类名替换id,isMemberOfClass将返回“YES”。否则它将失败

有趣的是:class方法每次都会返回正确的类

这是虫子吗?还是应该这样做

谢谢

编辑:

好的,这并没有解决问题。。我就是这么做的。。isMemberOfClass将始终返回NO

测试用例:

- (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");
    ....
}
广播等待类:

导入“BroadcastWaitBrick.h”

加载方法:

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


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

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

    return brick;
}

isMemberOfClass
在您的测试用例中返回
NO
,因为您将newBrick var声明为类Brick的成员


在这种情况下,更好的选择是使用
isKindOfClass
方法或将newBrick声明为
id

如果没有更多的代码,这是不可能回答的。请添加您正在使用的实际代码。感谢您的快速回复-我添加了代码片段..您能解释Brick和BroadcastWaitBrick类之间的关系吗?BroadcastWaitBrick派生自Brick
@interface BroadcastWaitBrick:Brick
这是与相同的问题;这个类被加载了两次,一次在测试代码中,一次在主代码中。这导致两个类的比较失败,这两个类应该是相同的。奇怪的是,这个测试每次都有效(例如,
BroadcastBrick
-(相同的实现(不同的是类名))但是它不适用于
BroadCastWaitBrick
…将其更改为id也没有帮助..我认为区别在于您测试的var的定义。在您的代码中,一切正常,但当您将Brick类对象创建为Brick*newBrick=[[BroadCastWaitBrick alloc]init]因此,您必须创建类Brick的对象。好的,我尝试将newBrick定义为BroadCastWaitBrick-但有趣的是,它也不起作用:找到解决方案。即使很难,我也不理解:我将BroadCastWaitBrick添加到我的TestTarget的BuildPhase中..BroadCastBrick没有被添加…如果我从测试目标它是有效的。正确的方法是什么?持有对象指针的变量绝对不会影响
isMemberOfClass:
isKindOfClass:
的成功或失败。当这些方法发生时,类型信息在运行时消失。测试是在实际对象上动态进行的。这是一个FundNameObjC的ntal部分。
-(BroadcastWaitBrick*)loadBroadcastWaitBrick:(GDataXMLElement*)gDataXMLElement
{


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

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

    return brick;
}