Преимущество косвенного выделения и инициализации объявленного @property - PullRequest
0 голосов
/ 15 сентября 2010

Когда дело доходит до выделения и инициализации объектов, которые объявлены @properties класса, я видел два основных шаблона в различных битах примера кода, поэтому, учитывая следующий (составленный) код заголовка -

@interface Class : Superclass {  
    Object *anObject;  
}  
@property (nonatomic, retain) Object *anObject;  

Первое прямое назначение:

self.anObject = [[Object alloc] init];

Второй косвенный метод создает временный объект, который затем присваивается свойству и освобождается:

Object *tempObject = [[Object alloc] init];
self.anObject = tempObject;
[tempObject release];

Какая выгода длявторой метод над первым?

Ответы [ 3 ]

3 голосов
/ 15 сентября 2010

Разница между этими двумя блоками кода в том, что первый - это утечка памяти. Когда вы звоните [Object alloc], вы получаете «право собственности» на объект и несете ответственность за -release его использование когда-нибудь. Затем, когда вы вызываете [self -setAnObject], требуется владение секунда , устанавливая счетчик сохранения для нового экземпляра равным 2. Если метод, выполняющий создание, возвращается, не отказываясь от владения новым экземпляром, вы в конечном итоге получаете утечка.

Попробуйте это:

self.anObject = [[[Object alloc] init] autorelease];

Это работает, потому что [NSObject -autorelease] возвращает self и также планирует -release вызов "когда-нибудь в будущем", что обычно означает в конце текущего цикла выполнения.

2 голосов
/ 15 сентября 2010

Возможно, вы опечатали первый шаблон. Прямое присвоение (переменной экземпляра) должно быть:

anObject = [[Object alloc] init];

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

Плохо то, что он избегает установщика (что приводит к потенциальным проблемам повторного использования / улучшения кода).

Хорошо, что он избегает установщика (важно, если это отображается в профиле как горячая точка).

2 голосов
/ 15 сентября 2010

Как правильно указывал предыдущий автор, первый метод (по крайней мере, в том виде, в котором он в настоящее время закодирован) - это утечка памяти.Однако второй метод технически более эффективен, поскольку с пулом автоматического выпуска связаны некоторые накладные расходы.

Добавление одного дополнительного объекта в пул, вероятно, не приведет к ощутимым изменениям, но добавление большого количества объектов в пулпул мог бы излишне, так что в целом второй метод предпочтительнее.

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