Вопрос управления памятью в задаче C - PullRequest
0 голосов
/ 23 августа 2009

У меня есть tableviewcontroller, где я заполняю некоторые данные из базы данных sqlite, и для каждой строки я загружаю файл с http-сервера и кеширую его локально. Я кеширую его только тогда, когда открывается подробный вид. И подробное представление возвращает эту таблицу через делегата после завершения загрузки файла.

Но когда само это табличное представление выталкивается из navicontroller., Вызов делегата завершается неудачно с EXEC_BAD_ACCESS

Я вызвал [_delegate retain] в setDelegate представления сведений, и все работает нормально, но я не уверен, что это приведет к утечке памяти ...

Может кто-нибудь посоветовать?

Ответы [ 2 ]

2 голосов
/ 23 августа 2009

Обычно делегаты не сохраняются, чтобы избежать циклов сохранения. Если делегат может быть освобожден до вас, тогда он обязан очистить вашу ссылку до того, как он будет окончательно освобожден (например, в его освобождении).

Однако, если какое-либо свойство установлено на «сохранить» или «копировать», вы должны сохранить / скопировать его в установщик (или использовать @synthesized setters, который сделает это за вас), и освободить его в dealloc, чтобы избежать протечки. Как уже было сказано выше, это может привести к циклу сохранения, так что ни один объект никогда не будет освобожден.

Я бы посоветовал вам включить некоторую отладку памяти с помощью переменных окружения NSZombieEnabled и NSAutoreleaseFreedObjectCheckEnabled и посмотреть, сообщает ли он, какой объект перевыпущен.

2 голосов
/ 23 августа 2009

Ваш делегат преждевременно освобождается, и отправка сообщения недопустимому объекту вызовет EXEC_BAD_ACCESS. Сохранение этого исправит проблему, но в целом рекомендуется не сохранять объект своим делегатом, поскольку существует вероятность сохранения циклов, поэтому вам может потребоваться переосмыслить свою структуру. Если вы освобождаете свой делегат, когда представление освобождается от просмотра, его нужно удалить, если только вы не сохраняете делегата в setDelegate:.

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