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;
}