在过去的几个小时里,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 ...迫使编译器单独处理它们?!
有人可以对此有所了解吗?我觉得我疯了吗?请告诉我我错了,我可以回去信任调试器。
谢谢,对不起那里的迷你咆哮。
答案 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"];