Являются ли эти два выражения сообщений Objective C эквивалентными по памяти? - PullRequest
2 голосов
/ 30 августа 2011

Приводят ли следующие два выражения сообщения к увеличению количества записей в том же объекте?

Пример 1:

iVar = [Foo aClassMethodInFoo];
[iVar retain];

Пример 2:

iVar = [[Foo aClassMethodInFoo] retain];

Пример 1 является явным в том смысле, что это экземпляр iVar, чей счет увеличен.Пример 2, кажется, предполагает, что он увеличил счетчик объекта, возвращенного из [Foo aClassMethodInFoo].Если это так, то если предположить, что aClassMethodInFoo является вспомогательным методом, какой объект я «освобождаю», чтобы уравновесить предыдущее «сохранение», чтобы не допустить утечки памяти?

Ответы [ 2 ]

6 голосов
/ 30 августа 2011

Оба абсолютно идентичны.В первом случае вы присваиваете результаты вызова метода переменной, а затем вызываете -retain для этой переменной.Чистым результатом является то, что переменная содержит объект, и вы вызвали -retain для объекта.Во втором случае вы вызываете -retain по результатам вызова метода и присваиваете результат этой переменной.Поскольку -retain гарантированно возвращает свой получатель, чистый результат - переменная, содержащая объект, и вы вызвали -retain для объекта.

В обоих случаях семантика памяти точно идентична.В соответствии с соглашениями об именах, определенными в Руководство по программированию управления памятью , метод с именем +aClassMethodInFoo возвращает объект с автоматическим освобождением, поэтому ваш вызов -retain будет правильным, если вы сохраняете результаты в иваре.Таким образом, когда вы закончите, вы можете позвонить -release на свой ивар.Ваш вопрос «какой объект я« освобождаю »» бессмысленен, потому что здесь только один объект.

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

Предполагая, что метод класса возвращает новый объект, а не void, они в точности эквивалентны, поскольку retain просто возвращает self.

...