Разрушение объекта разрушает объект? - PullRequest
3 голосов
/ 03 июня 2011

Я новичок в какао-прикосновении, и действительно неуправляемые языки все вместе. Хотя я твердо понимаю синтаксис, я задаюсь вопросом, правильно ли я освобождаю объект.

У меня есть вид, который создает объект,

Communication *comm = [[Communication alloc] init];
[comm doSomething];
[comm release];

Я понимаю, что должен уничтожить этот объект, потому что я его выделяю, и он не будет автоматически освобожден.

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

  1. Если я отпущу этот объект сразу после вызова, уничтожит ли он этот объект? (Что я не хочу делать.)
  2. Как правильно уничтожить этот объект после того, как он сгенерирует событие с данными, которые я жду? Это произошло бы в событии DataFinishedLoading на моем comm объекте. Должен ли он уничтожить себя, и это правильный способ сделать это?

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

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

A release уничтожает объект только в том случае, если последний держатель освободил его.

Например, скажем, вы выделили свой объект Communication.Это неявно сохраняется один раз.Тогда вы сохраните его пять раз.Вам нужно отпустить / автоматически освободить объект шесть раз, пока он не будет уничтожен (вызывается его метод dealloc).

Есть внутренний счетчик, retainCount.Когда вы создаете объект, он устанавливается на 1.Теперь каждый retain увеличивает счетчик, а каждый release уменьшает его.autorelease также уменьшает счетчик, но не сразу.Как только счетчик падает до 0, Objective-C узнает, что объект больше не нужен, и уничтожает его (вызывая объект dealloc). Предупреждение: не полагайтесь на retainCount, даже не смотрите на него.Вам следует заботиться только о том, чтобы ваши alloc/copy/new/retain звонки были сбалансированы с соответствующим release/autorelease позже.

2 голосов
/ 03 июня 2011

В приведенном выше примере comm будет вероятно будет уничтожено при вызове release. Это зависит от того, что еще кто-то сохраняет во время doSomething.

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

...