我有一个方法应该返回从contentsOfFile创建的UIImage(以避免缓存),但是当它返回时,我会收到EXC_BAD_ACCESS。通过仪器运行不会显示任何结果,因为它只是运行,而不是停在僵尸上。
图像已在Bundle Resources阶段正确复制......
- (UIImage *)imageForName:(NSString *)name {
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"];
return [UIImage imageWithContentsOfFile:path];
}
此方法改编自PhotoScroller样本,该样本正常工作。
由于
编辑:
这是使用imageForName的代码,根据Luke / T的建议你可以看到我添加了retain,但EXC_BAD_ACCESS在返回时,而不是我的addObject:call:
NSMutableArray *images;
for (NSDictionary *dict in imageListForPage){
[images addObject:[[self imageForName:[dict valueForKey:@"name"]]retain]];
}
答案 0 :(得分:2)
ImageWithContentsOfFile将返回一个自动释放的对象。如果您没有保留它(返回[编辑]),那么您将获得不良访问权。
编辑:
检查NSarray的指针。您需要正常启动数组alloc
或使用arraywith
e.g。
NSMutableArray *images = [NSMutableArray arrayWithCapacity:ARRAY_CAPACITY];//autoreleased
或
NSMutableArray *images = [[NSMutableArray alloc] init];//release later
答案 1 :(得分:0)
将对象添加到NSMutableArray
会隐式发送retain
,因此您的代码中不需要这样做。
您能否确认(使用NSLog()
或断点)
[UIImage imageWithContentsOfFile:path]
返回imageForName:
方法中的对象?
答案 2 :(得分: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];