или [self dealloc] работа? - PullRequest
       3

или [self dealloc] работа?

1 голос
/ 01 июня 2011

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

Если я нахожусь в последней команде объекта, могу ли я отправить [self release], чтобы освободить память? Но проблема в том, что retainCount может быть больше, чем на одного?

Как

  ObjectToDealloc *test = [[ObjectToDealloc alloc] init];
  [test doYourJob];
  //can't release here, it broke my program

в последний раз, что этот объект делает, он запускается:

  -(void)destroyYourself {
     [self release];
     [self dealloc];
  }

Это будет работать? Я выпущу память? Или я должен сделать «тест» в глобальной видимости (не только видимость функции) и сделать:

   [test release];

Ответы [ 2 ]

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

Это не правильное управление памятью.Есть небольшое количество случаев, когда [self release] является правильным.Нет случаев, когда [self dealloc] является правильным (вам никогда не следует называть чей-либо номер dealloc, кроме вашего суперкласса, в вашем собственном dealloc).

Когда вы говорите "это сломало мою программу" выше, что выимею в виду?ObjectToDealloc выполняет какую-то фоновую обработку?Если это не так, то вы всегда должны быть в состоянии отпустить его в указанном вами месте.Если он выполняет фоновую обработку, то вам нужно что-то, чтобы сохранить объект до его завершения, а затем отпустить его.Время от времени лучшим подходом является сохранение и освобождение self, но обычно у вас есть что-то другое, например NSOperationQueue или подобное.

Более вероятная проблема заключается в том, что вы обрабатываетенеправильно управление памятью в ObjectToDealloc и что при ее освобождении происходит сбой.Что такое сбой?

Главное, что нужно помнить, это то, что вы никогда не говорите «уничтожить этот объект прямо сейчас» в ObjC.Вы говорите: «Я закончил с этим объектом».Когда все завершают работу с объектом, он уничтожается средой выполнения.

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

Есть несколько случаев, когда я видел классы, которые сохраняют себя, чтобы не отставать, пока они не выполняют работу. НИКОГДА, НИКОГДА, НИКОГДА НЕ ВЫЗЫВАЙТЕ DEALLOC *. Dealloc не для вас, а для времени выполнения. Если вам больше не нужен объект, просто отпустите его. Вызывать этот метод является только обязанностью среды выполнения.

Вот пример некоторого кода, который я регулярно использую, когда объект сохраняет себя, а затем соответствующим образом освобождает себя, когда завершает свою работу: UIAlertView + Blocks Этот код делает это, потому что объект должен оставаться вокруг даже после того, как он был выпущен экземпляром класса, чтобы он мог запустить и завершить блоки, которые ему было дано выполнить.

* За исключением случаев, когда вы звоните своему суперлоку в ваш собственный деллоок, но это само собой разумеется.

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