UIImage не загружает изображение - PullRequest
1 голос
/ 01 октября 2011

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

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

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 ]

8 голосов
/ 01 октября 2011

[[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]; 
4 голосов
/ 01 октября 2011

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

Инициализированный объект 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");
0 голосов
/ 01 октября 2011

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

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

0 голосов
/ 01 октября 2011

попробуйте:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...