2010-11-17 78 views
0

我有一個方法,應該返回從contentsOfFile創建的UIImage(以避免緩存),但是當它返回時,我收到EXC_BAD_ACCESS。通過儀器運行不會顯示任何結果,因爲它只是運行,而不會停在殭屍上。EXC_BAD_ACCESS當返回UIImage

的圖像被在包資源相位正確複製...

- (UIImage *)imageForName:(NSString *)name { 
    NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"]; 
    return [UIImage imageWithContentsOfFile:path]; 

}

改編自PhotoScroller樣品,其正常工作此方法。

感謝

編輯:

這是一個使用imageForName的代碼,你可以看到我添加了保留,按盧克/ T的建議,但EXC_BAD_ACCESS是回報,不是我ADDOBJECT :call:

NSMutableArray *images; 

for (NSDictionary *dict in imageListForPage){ 
    [images addObject:[[self imageForName:[dict valueForKey:@"name"]]retain]]; 
} 
+0

我們需要看到的是使用imageForName的代碼,看到盧克的回答 – willcodejavaforfood 2010-11-17 11:08:00

回答

2

ImageWithContentsOfFile將返回一個自動釋放的對象。如果你不保留它(返回[編輯]),那麼你將得到一個不好的訪問。

編輯:

檢查NSarray的指針。您需要像正常那樣初始化陣列alloc或使用arraywith

例如,

NSMutableArray *images = [NSMutableArray arrayWithCapacity:ARRAY_CAPACITY];//autoreleased 

NSMutableArray *images = [[NSMutableArray alloc] init];//release later 
+1

不要保留它在'imageForName:'本身,雖然。 – 2010-11-17 11:09:15

+0

我改變了上面的代碼,以顯示當我這樣做時會發生什麼。就好像圖像不能被找到,但我沒有得到零。 – joec 2010-11-17 11:21:44

0

將對象添加到一個NSMutableArray將隱含發送一個retain,所以這不是在你的代碼需要。

,你能否證實(使用NSLog()或斷點),其

[UIImage imageWithContentsOfFile:path]

imageForName:方法返回一個對象?

0

最後,該代碼應該是:

NSMutableArray *images = [NSMutableArray new]; // new is same as [[alloc] init] 

for (NSDictionary *dict in imageListForPage) { 
    [images addObject:[self imageForName:[dict valueForKey:@"name"]]]; 
} 
// ... do something with images 
[images release];