2009-09-20 84 views
0

它肯定好像Xcode調試已經打使壞對我的最後幾個小時。困惑調試不一致之處[一個NSBundle mainBundle]

我這個代碼,有工作 - 在事後 - 一個很明顯的錯誤,但它並不明顯的時候:

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

我用調試器單步執行代碼,它一直說在[NSBundle mainBundle]調用之後bundle沒有。這導致我爲什麼可能會搜索高和低,並試圖修復的問題。最後,我發現了實際的錯誤(這是我追加路徑的兩次),所以我決定做一些試驗......顯然,捆綁不是零,那麼爲什麼調試器說它是?當通過步進這個代碼,調試器正確顯示束值的mainBundle調用後:

- (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一起......迫使編譯器分別處理它們?!

任何人都可以對此有所瞭解嗎?我覺得我瘋了嗎?請告訴我,我錯了,我可以回去信任調試器。

謝謝,抱歉,迷你咆哮,那裏。

+1

嗨,你可能是正確的關於優化。這是一個調試版本,對吧?你爲目標的GCC_OPTIMIZATION_LEVEL設置了什麼? – 2009-09-20 08:20:08

+0

你應該改變你的評論給答案,所以我可以給你信貸。果然,我有發佈檢查,而不是調試(不知道爲什麼 - 可能只是我愚弄,忘記把東西回來)。調試器現在能夠正確調試問題代碼。我肯定很難學習這個iPhone的東西。謝謝!! – Rob

+0

要構建路徑,您應該使用-stringByAppendingPathComponent:而不是使用-stringWithFormat:手動構建路徑。 –

回答

0

我看你已經解決了這個問題,但在最新的XCode建立調試器控制檯應該說「變量X已被優化掉」當您嘗試打印到一個發佈版本。

+0

我將此標記爲已接受的答案,只是爲了不接受答案而不予理睬。 (上面的評論是真實的答案......但評論不能被接受爲答案。) – Rob

0

您應該使用stringByAppendingPathComponent:構建您的路徑,而不是標記在斜線字符上。我有一個UIImage的類別標準從資源文件夾取得圖片:

+(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"]; 
相關問題