#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
где-нибудь.