相关疑难解决方法(0)

isKindOfClass意外返回NO

我的一个单元测试失败了,原因是我没有预料到.似乎是一个调用isKindOfClass返回NO,但是当我调试并逐步执行时,它似乎没有理由.

代码是:

if ([self.detailItem isKindOfClass:[MovieInfo class]]) {
    [self configureViewForMovie];
}
Run Code Online (Sandbox Code Playgroud)

我逐步完成了代码并做了:

po self.detailItem
Run Code Online (Sandbox Code Playgroud)

显示:

(id) $1 = 0x0ea8f390 <MovieInfo: 0xea8f390>
Run Code Online (Sandbox Code Playgroud)

那么,我错过了什么,为什么在这种情况下if语句会返回false?

编辑:

这是DetailItem的setter:

- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        NSLog(@"%@", [newDetailItem class]);
        _detailItem = newDetailItem;

        // Update the view.
        [self configureView];
    }

    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    } 
}
Run Code Online (Sandbox Code Playgroud)

它是Master Detail模板的模板代码.

单元测试在setUp中创建一个MovieInfo:

movie = [[MovieInfo alloc] initWithMovieName:@"Movie" movieID:1];
Run Code Online (Sandbox Code Playgroud)

并在测试中设置它

controller.detailItem = movie;
Run Code Online (Sandbox Code Playgroud)

另外,我添加了一个参数断言setDetailItem:

NSParameterAssert([newDetailItem isKindOfClass:[MovieInfo class]] || [newDetailItem isKindOfClass:[PersonInfo class]] || newDetailItem …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c

18
推荐指数
1
解决办法
4205
查看次数

isKindOfClass和NSStringFromClass不同意UIApplicationDelegate

我正在玩一个简单的OCUnit测试用于iPhone应用程序,并且只是想断言应用程序委托是我期望它的类的实例.我没想到这个测试非常有用,但结果却揭示了我对Objective C的误解.

我首先得到了代表的参考.然后我记录回来的类名.在我的例子中,输出正确地说"app delegate的类名是CalculatorAppDelegate".

但是,下一行的断言失败了,我不明白为什么.

- (void)testAppDelegate 
{
    id appDelegate = [[UIApplication sharedApplication] delegate];
    NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class]));
    NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);
    NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);
    NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]);
    STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf");
}
Run Code Online (Sandbox Code Playgroud)

什么情况可能导致NSStringFromClass()返回正确的类名,而isKindOfClass返回false?

2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0
2011-03-19 15:51:13.865 Calculator[40092:207] class == class …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ocunit cs193p uiapplicationdelegate

14
推荐指数
1
解决办法
4151
查看次数