Нужно ли освобождать возвращенный объект NSError? - PullRequest
7 голосов
/ 29 октября 2009

Существует много методов Какао, для которых в качестве параметра метода требуется объект NSError, но на самом деле это средство возврата объекта ошибки вызывающему методу, если существуют ошибки. Этот возвращенный объект сохраняется? То есть в коде вызывающего объекта (метода, в который возвращается ошибка) должен ли быть какой-то код, подобный:

  NSError *error;
  [apiCall .... error:&error];

  if (error){
    [*error release];
 }

Я нигде этого не видел, и если это нужно выпустить, это способ сделать это?

Ответы [ 3 ]

7 голосов
/ 29 октября 2009

Возвращенные объекты обычно автоматически высвобождаются. Общее правило заключается в том, что вы вызываете auto- / release, только если ранее вы вызывали copy / alloc / retain для того же объекта. И вы не разыменовываете error в вызове метода:

// right
[error code]
// wrong
[*error code]
6 голосов
/ 29 октября 2009

Ознакомьтесь с правилами памяти на developer.apple.com Никогда не доверяйте никому, повторяя их как «вы ранее называли copy / alloc / retain» - это не правило, которое фактически говорит что-то вроде «вы получили объект с помощью метода с copy, new или alloc как частью имени». Опять же, не верьте мне, читайте developer.apple.com

Что касается NSError * *, то это просто неправильно. МЕТОД принимает NSError * * в качестве аргумента, то есть указатель на NSError *. Это указатель на NSError *, который будет заполнен адресом NSError, который исходит от где-то , и вы не имеете права предполагать, где.

Вы можете только передать указатель на NSError * - все остальное не так.

Также вы не должны предполагать, что NSError автоматически выпускается. Это может быть синглтон, это может быть любое количество альтернатив. Все, что вам нужно знать, это то, что «вы не сохранили его, вам не нужно его выпускать».

4 голосов
/ 29 октября 2009

Вы не выделили память для ошибки, поэтому вам не нужно ее освобождать. Как правило, фреймворк обычно добавляет авторелиз ко всем создаваемым объектам.

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