UIImage не загружает изображение

#objective-c #ios #uiimage

#objective-c #iOS #UIImage

Вопрос:

Я использую UIImage для построения png. Я получаю странное поведение, которое я не могу понять.

Следующий фрагмент кода приводит к нулевой ссылке im и, таким образом, выводит «ПРОБЛЕМА!»

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

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

Этот фрагмент кода работает отлично:

 UIImage *im = [UIImage alloc]; 

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

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

Чего мне не хватает?

Ответ №1:

[[UIImage alloc] initWithContentsOfFile:@"tree.png"]; вернет вам изображение, если изображение /tree.png существует. Но его не существует. Вы должны initWithContentsOfFile указать полный путь, а не только имя файла.

Теперь второй код работает из-за [UIImage alloc] возврата некоторой ссылки, которая не инициализирована. В следующей строке вы пытаетесь инициализировать его, [im initWithContentsOfFile:@"tree.png"]; но забыли сохранить возвращаемое значение im , например: im = [im initWithContentsOfFile:@"tree.png"]; .

Если изображение tree.png сохранено в вашем пакете, вы можете использовать такой подход: UIImage *im = [UIImage imageNamed:@"tree.png"]; или такой:

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

Ответ №2:

Находится ли изображение в вашем пакете и является ли оно изображением PNG? В документации UIImage упоминается следующее при использовании initWithContentsOfFile:

Инициализированный объект UIImage или nil, если метод не смог найти файл или инициализировать изображение из его содержимого.

Кроме того, поскольку вы используете UIImage локально, я предполагаю из вашего кода, вы можете просто использовать метод imageNamed: класса, подобный so, и он будет искать изображение в вашем основном пакете:

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

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

Ответ №3:

попробуйте:

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

чтобы загрузить изображение из вашего пакета приложений.

Комментарии:

1. ответ остался без ответа, когда я его написал.

Ответ №4:

Кстати, ваш второй фрагмент кода потенциально опасен. На самом деле initWithContentsOfFile: вызывает autorelease объект, если файл не найден. И если вы попытаетесь получить доступ к изображению через некоторое время, это будет ошибка (EXC_BAD_ACCESS).

Так что вы всегда должны использовать init методы в паре с alloc и не забывайте release где-нибудь.