Какова правильная последовательность при освобождении объекта? - PullRequest
1 голос
/ 13 августа 2011

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

NSMutableString *string1 = [[NSMutableString alloc]initWithFormat:@"ABCDEF"];
 :
progress some code.
 :
string1 = nil;
[string1 release];

Вопрос как ниже.

string1 = nil;<= потерян указатель string1 путем присвоения nil. </p>

И затем [string1 release];<= Может отправить сообщение получателю string1? </p>

  1. string1 = nil;

    [освобождение строки1];

  2. [string1 release];

    string1 = nil;

    Что такое правильная последовательность?

    [Дополнительный вопрос ..]

    Можно ли объявить @propertyобъекта (NSString, NSNumner, NSARRAY ...), который находится в пользовательском методе?

Ответы [ 3 ]

3 голосов
/ 13 августа 2011

Это на самом деле не выполняет то, что вы пытаетесь сделать.Кажется, это работает только потому, что Objective C позволяет отправлять сообщения на нулевые указатели объектов.Вы правы в своем примере, что вы теряете указатель на выделенную память и, следовательно, оставляете его невыпущенным.

Правильный способ сделать это - просто вызвать release для строки, а затем установить для него значениеnil (второй сценарий в вашем примере).


Обратите внимание: если бы string1 было свойством класса с ключевым словом retain, вы могли бы сделать что-то вроде этого:

self.string1 = nil;

И это фактически освободит переменную.Это зависит от деталей реализации, связанных с синтезом, так что вам не нужно беспокоиться об этом: ваш первоначальный вопрос.Просто интересная заметка.

2 голосов
/ 13 августа 2011

Ваш # 2 - правильная последовательность. Сначала вы освобождаете выделенный объект, а затем устанавливаете указатель на nil, чтобы впоследствии не делать с ним ничего (ненадежный адрес).

В # 1 после установки указателя на nil он больше не указывает на реальный объект, поэтому вызов release для указателя (nil) не вызывает ошибку, но ничего не делает.

0 голосов
/ 13 августа 2011

Некоторая дополнительная информация о том, что объяснил Восприятие. Синтезированный сеттер генерирует код, который выглядит примерно так (для @property (nonatomic, copy) NSString *string):

- (void)setString:(NSString *)newString
{
   if ([string isEqualToString:newString]) return;

   [string autorelease];
   string = [newString copy];
}

Теперь, когда строка будет иметь текущее значение test, а newString - значение nil, тогда строка будет освобождена, и копия не будет выполняться, поскольку сообщение copy отправляется на nil. Вот почему self.string = nil правильно освободит строку, в то же время установив указатель на ноль.

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