Утечка объекта после добавления вложенного представления

#objective-c #cocoa-touch #ipad #memory-leaks

#objective-c #cocoa-touch #iPad #утечки памяти

Вопрос:

Коллеги-разработчики,

Я пытаюсь установить веб-изображение в качестве фона для UIButton. Все работает, за исключением того, что когда я создаю и анализирую, это показывает, что у aImage все еще есть ссылка 1. Добавление релиза для aImage после addSubview не решает проблему. Я думаю, что мог бы решить эту проблему, создав подкласс и написав пользовательский dealloc, но это похоже на запутанное решение. У кого-нибудь есть какие-либо предложения? Спасибо!

 UIImage *aImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:mUrl]];
[myOverviewButton setBackgroundImage:aImage forState:UIControlStateNormal];
[aView addSubview:myOverviewButton];
  

Ответ №1:

либо добавьте авторелиз в aImage, либо вызовите release для него вручную.

 UIImage *aImage = [[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:mUrl]] autorelease];
  

Когда вы вызываете setBackgroundImage:, кнопка выполняет сохранение изображения. Когда вы выполняли alloc / init, вы сохраняли файл, который так и не был выпущен.

Ответ №2:

Как только показанный вами код завершит выполнение, количество ссылок aImage должно быть равно 2: одна из alloc вызова и одна из setBackgroundImage:forState: call. Вы должны выпустить после, setBackgroundImage:forState: чтобы сбалансировать alloc , но у вас все равно будет количество ссылок, равное 1. Это ожидаемо — в противном случае myOverviewButton не было бы изображения для работы. При myOverviewButton освобождении значение должно уменьшиться до 0.