Сообщения в освобожденный экземпляр - изящно проваливаются - PullRequest
0 голосов
/ 09 июля 2010

Я получаю это сообщение. Дело в том, что я хочу, чтобы какао просто не отправляло уведомление, если объект больше не существует. Есть ли способ сделать это?

Более широкая картина: Я отправляю запросы на сервер, но пока этот запрос продолжается, возможно, пользователь сделал что-то, чтобы уничтожить объект, ожидающий запрос. Когда ответ возвращается, объекта, который его запросил, больше нет, поэтому я просто хочу, чтобы центр уведомлений не обрабатывал сообщение.
Прямо сейчас я сохраняю объект, когда он запрашивает сообщение, и освобождаю его, когда он получает ответ. Таким образом, я не отправляю сообщения в освобожденные экземпляры. Но если он никогда не получит ответ, то он не может быть освобожден, что приводит к утечкам памяти. Отсюда моё обоснование попытки изящно обработать сообщения для освобожденных экземпляров.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 09 июля 2010

При отправке сообщения об освобожденном объекте не происходит "изящного сбоя".

Выделенный объект поддерживается битом памяти, выделенным в куче.Он может иметь много ссылок на это распределение;много указателей, которые содержат адрес указанного распределения.Когда объект освобожден, все эти указатели все еще указывают на него, если явно не сбросить какое-либо другое значение.И, разумеется, после освобождения этого бита o 'память может быть перераспределена.

То есть, нет магии - никакой эффективной магии в любом случае [см. NSZombie] -для превращения всех указателей на конкретный объект во что-то, что волшебным образом съедает все сообщения без ошибок.

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

0 голосов
/ 09 июля 2010

Как говорит bbum, вы не можете отправлять сообщения освобожденным объектам. Это просто неверно. Нет даже такой вещи, как «освобожденный объект» - как только объект освобожден, он просто исчез. Это больше не вещь и не существует нигде. Его старый битовый шаблон может остаться, или на его место может быть помещен несвязанный объект, или абсолютный мусор - вот откуда происходят сбои, а не какой-то волшебный обработчик «освобожденных объектов».

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

0 голосов
/ 09 июля 2010

Если объект больше не существует и вы не хотите, чтобы он падал при отправке сообщения в мусор (то есть, если у вас есть указатель на освобожденный объект, и вы отправляете этот указатель сообщение, что приводит к неприятному сбою ), если вы хотите избежать этого, установите указатель на nil после того, как вы release его. Это означает, что вы сделали с объектом. Отправка сообщений на nil вполне приемлема, но отправка сообщений на указанный мусор - нет.

[iVar release];
iVar = nil; // done with this reference.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...