Освобождение (неатомного, сохраняющего) синтезированного свойства - PullRequest
0 голосов
/ 29 февраля 2012

Мой вопрос похож на дюжину вопросов об освобождении свойств, но я не могу найти точный ответ, который ищу.

Когда объект объявлен с сохранением:

@property (nonatomic, retain) NSString * myString;

тогда

@synthesize myString;

Генерирует геттеры и сеттеры с операциями удержания и высвобождения. Хорошо.

Конечно, собственность должна быть освобождена в dealloc.

-(void)dealloc {
    [myString release];
    myString = nil;
    [super dealloc];
}

Так что это чисто.

Но что, если я никогда не использую myString? Это предварительно инициализировано? Мое мнение, что число сохранения myString будет равно 0. Но выпуск myString в dealloc уменьшит его и приведет к аварийному завершению приложения? Но это не сбой!

Является ли более чистый способ выпустить его как?

if(myString != nil) {
    [myString release];
    myString = nil;
}

Ответы [ 4 ]

2 голосов
/ 29 февраля 2012

Главное, что вам не хватает - вы можете отправлять сообщения на ноль.Так что нет, ваш последний подход не чище, просто не нужен.

Если вы никогда не используете myString, он ни к чему не инициализируется.Осталось ноль.Когда вы отпускаете его, вы фактически делаете [nil release] - что на самом деле ничего не делает.Следовательно, нет сбоев.

1 голос
/ 29 февраля 2012

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

1 голос
/ 29 февраля 2012

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

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

Это не то же самое с переменными, которые вы создаете в методе, они могут указывать на неверную память.Таким образом, установка их на nil является безопасным способом.Это не нужно для свойств.

0 голосов
/ 29 февраля 2012

, если вы используете @property(retain/copy) & @synthesize, нет необходимости проверять nil.Это не приведет к сбою или выбрасыванию EXC_BAD_ACCESS.

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

...