Выпуск NSData вызывает исключение - PullRequest
4 голосов
/ 16 апреля 2009

Может кто-нибудь объяснить, почему следующий код заставляет мое приложение бомбить?

NSData *myImage = UIImagePNGRepresentation(imageView.image);
  :
[myImage release];

Если я закомментирую строку 'release', приложение запустится ... но несколько раз вызовет функцию, содержащую этот код, и у меня произойдет сбой - я думаю, это вызвано утечкой памяти.

Даже если я комментирую ВСЕ остальное в функции и просто оставляю эти две строки, когда запускается релиз, приложение вылетает.

Я уверен, что это, должно быть, новичок, "ты не знаешь, как правильно навести порядок"; -)

Приветствия

Джейми.

Ответы [ 3 ]

4 голосов
/ 16 апреля 2009

Вы уверены, что должны звонить release - общее правило API-интерфейсов MacOS состоит в том, что методы, передающие право собственности, имеют Copy или Create в своем имени. Я подозреваю, что вам дают ссылку на базовое представление изображения, а не на копию, и в этом случае вы освобождаете объект, принадлежащий чему-то другому.

4 голосов
/ 16 апреля 2009

Посмотрите на управление памятью, вы можете найти здесь несколько веток, или вы можете взглянуть на эту страницу . Я не буду вдаваться во все правила здесь, но основная проблема в том, что myImage автоматически высвобождается, а не сохраняется - когда вы вручную вызываете release, он не связан с retain, поэтому, когда autorelease пытается удалить (теперь недействительный) объект в конце цикла выполнения ваше приложение будет аварийно завершено. Удаление релиза решит проблему, но потратьте некоторое время на изучение правил сохранения / выпуска, это одна из самых важных вещей для понимания.

0 голосов
/ 01 июня 2011

Вы НЕ должны выпускать этот объект! Apple говорит: «Возвращаемое значение автоматически освобожденный объект данных, содержащий данные PNG, или ноль, если возникла проблема при создании данных. "

...