UIImage无法加载图像

时间:2011-10-01 09:28:38

标签: objective-c ios uiimage

我正在使用UIImage来绘制png。我得到了一种我无法理解的怪异行为。

以下代码导致nil im reference并因此打印“PROBLEM!”

UIImage *im = [[UIImage alloc] initWithContentsOfFile:@"tree.png"]; 

if (nil==im)
    NSLog(@"PROBLEM! IMAGE NOT LOADED\n");
else
    NSLog(@"OK - IMAGE LOADED\n");

这段代码很好用:

UIImage *im = [UIImage alloc]; 

[im initWithContentsOfFile:@"tree.png"];

if (nil==im)
    NSLog(@"PROBLEM! IMAGE NOT LOADED\n");
else
    NSLog(@"OK - IMAGE LOADED\n");

我错过了什么?

4 个答案:

答案 0 :(得分:8)

如果图片[[UIImage alloc] initWithContentsOfFile:@"tree.png"];存在,

/tree.png会返回您的图片。但它不存在。您应该传递到initWithContentsOfFile完整路径,而不仅仅是文件名。

现在,第二个代码可以正常工作,因为[UIImage alloc]会返回一些未初始化的引用。在下一行中,您尝试使用[im initWithContentsOfFile:@"tree.png"];初始化它,但您忘记在[{1}}中保存返回的值,如下所示:im

如果图片im = [im initWithContentsOfFile:@"tree.png"];已保存在您的捆绑包中,那么您可以使用此类方法:tree.png或其他:

UIImage *im = [UIImage imageNamed:@"tree.png"];

答案 1 :(得分:4)

图片是否在图片中并且是PNG图片?使用initWithContentsOfFile:

时,UIImage文档提到了以下内容
  

初始化的UIImage对象,如果方法无法找到文件或从其内容初始化图像,则为nil。

此外,由于您在本地使用UIImage,我假设您可以使用imageNamed:类方法,因此它可以在主包中搜索图像:

UIImage *im = [UIImage imageNamed:@"tree.png"];

if (nil==im)
    NSLog(@"PROBLEM! IMAGE NOT LOADED\n");
else
    NSLog(@"OK - IMAGE LOADED\n");

答案 2 :(得分:0)

尝试:

NSString *path = [[NSBundle mainBundle] pathForResource:@"tree" withExtension:@"png"];
UIImage *im = [[UIImage alloc] initWithContentsOfFile:path];

从应用程序包中加载图像。

答案 3 :(得分:0)

顺便说一句,你的第二段代码是有潜在危险的。实际上,如果找不到文件,initWithContentsOfFile:会为对象调用autorelease。如果您在一段时间后尝试访问图像,则会出错(EXC_BAD_ACCESS)。

因此,您应始终将init方法与alloc配对使用,并且不要忘记release位于某处。