与[NSBundle mainBundle]混淆调试器不一致

时间:2009-09-20 07:47:04

标签: iphone objective-c xcode debugging

在过去的几个小时里,Xcode调试器似乎一直在玩弄肮脏的伎俩。

我正在使用这个代码 - 事后看来 - 这是一个非常明显的错误,但当时并不明显:

- (UIImage*)loadBundleImage:(NSString*)imageName {   
    NSBundle* bundle = [NSBundle mainBundle];
    NSString* path = [bundle bundlePath];
    path = [path stringByAppendingFormat:@"%@/%@", path, imageName];
    return [UIImage imageWithContentsOfFile:path];
}

我正在使用调试器来逐步执行代码,并且在[NSBundle mainBundle]调用之后它一直说捆绑是nil。这导致我搜索高低可能的原因,并尝试修复那个问题。

最终,我发现了实际的错误(这是我两次追加路径),所以我决定做一些实验......显然,捆绑不是为零,所以为什么是调试器说它是?当单步执行代码时,调试器会在mainBundle调用之后正确显示bundle的值:

- (UIImage*)loadBundleImage:(NSString*)imageName {   
    NSBundle* bundle = [NSBundle mainBundle];
    if (bundle == nil) {
        NSLog(@"Nil bundle");
    }
    NSString* path = [bundle bundlePath];
    path = [path stringByAppendingFormat:@"/%@",imageName];
    return [UIImage imageWithContentsOfFile:path];
}

那么,这里给出了什么?这是调试器的错误吗?我唯一的猜测是,编译器正在优化对mainBundle和bundlePath的连续调用,以进行某种原子操作,因此调试器无法“看到”发生了什么......但是当我打破这两个调用时使用if-block ...迫使编译器单独处理它们?!

有人可以对此有所了解吗?我觉得我疯了吗?请告诉我我错了,我可以回去信任调试器。

谢谢,对不起那里的迷你咆哮。

2 个答案:

答案 0 :(得分:0)

我发现你已经解决了这个问题,但是在最新的XCode构建中,当你尝试在发布版本中打印时,调试器控制台应该说“变量X已被优化掉”。

答案 1 :(得分:0)

您应该使用stringByAppendingPathComponent:来构建路径,而不是在斜线字符上进行标记。我在UIImage上有一个标准类别,它从Resources文件夹中获取图像:

+(UIImage*)imageFromResourceFileNamed:(NSString*)name;
{
if(!name) return nil;
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:name];
return [[[UIImage alloc] initWithContentsOfFile:path] autorelease];     

}

像这样使用:

UIImage *prettyImage = [UIImage imageFromResourceFileNamed:@"flower.png"];