Сборка мусора и сохранение / освобождение в установщиках свойств - PullRequest
0 голосов
/ 03 мая 2011

Когда я читал о свойствах Objective-C, мне всегда говорили создавать сеттеры (или позволить механизму свойств создавать сеттеры) следующим образом:

- (void)setMyProperty:(MyClass *)newValue
{
   [newValue retain];
   [ivInstanceVariable release];
   ivInstanceVariable = newValue;
}
// or
- (void)setMyProperty:(MyClass *)newValue
{
   [ivInstanceVariable autorelease];
   ivInstanceVariable = [newValue retain];
}

Я не понимаю.Я знаю, что retain увеличивает счетчик объектов и release уменьшает его для сборщика мусора, но как проще:

- (void)setMyProperty:(MyClass *)newValue
{
   ivInstanceVariable = newValue;
}

привести к утечкам памяти?Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Когда вызывается ваш метод set, вы не знаете, каков счет сохранения передаваемого объекта. Это может быть 1, а release может быть вызван сразу после вызова метода set.

Задача метода set - указывать, что объект нельзя освобождать, вызывая для него команду retain.

Что касается вызова release, когда устанавливается новое значение, ваш метод set должен вызывать release для старого значения, чтобы указать, что оно больше не нужно.

Наконец, вам следует вызвать retain для нового значения и release для старого значения в указанном порядке, потому что, возможно, вам будет передано точно такое же значение, которое уже было установлено.

0 голосов
/ 03 мая 2011

Классическим шаблоном для сеттера "неатомного удержания" является ...

- (void)setMyProperty:(MyClass *)newValue
{
if (ivInstanceVariable != newValue) {
 [ivInstanceVariable release];
 ivInstanceVariable = [newValue retain];
 }
}

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

- (void)setMyProperty:(MyClass *)newValue
{
if (ivInstanceVariable != newValue) {
 [ivInstanceVariable release];
 ivInstanceVariable = [newValue copy];
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...