Что автоматически сохраняет и выпускает? - PullRequest
1 голос
/ 17 июня 2011

Я вроде понял, что сохраняет и выпускает автоматически, но я не могу найти никаких официальных данных по этому вопросу, и я думаю, что я что-то не так понял.

  1. Установка свойств, объявленных с помощью @property (retain), сохранит и освободит старое значение, но не установит свойства внутри того же объекта без self.
  2. Все объекты внутри метода (включая параметры) сохраняются при создании / передаче и освобождаются при возврате метода.
  3. Объект, который возвращается методом, не будет освобожден, но вместо этого будет освобожден методом, к которому он возвращен, поскольку его локальная переменная внутри метода.

Я что-то не так понял / что-то забыл?
Что произойдет, когда возврат будет отменен? как [object someMethodThatReturnsAnObject];. он не будет локальным для метода, к которому он возвращен, поэтому я не уверен, будет ли он выпущен, и xCode предупреждает об этом.

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Вместо того, чтобы гадать, прочитайте документацию . Это окончательно.

Установка объявленных свойств с @property (сохранить) сохранит и отпустите старое значение, но не настройку свойства внутри одного и того же объекта без себя.

Вроде. Нет «установки свойства без себя». Это устанавливает переменную экземпляра напрямую.

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

Нету; см. документы.

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

Совсем нет; см. документы.

2 голосов
/ 17 июня 2011

Установка свойств, объявленных с помощью @property (retain), сохранит и освободит старое значение, но не установит свойства внутри того же объекта без self.

Вызов метода установкиэто было синтезировано для сохраняющего свойства освободит старое значение и сохранит новое.Установка ивара напрямую, без прохождения через аксессор, ничего не даст, кроме как назначить ивара.Он не будет ни сохранять, ни освобождать.self.foo = bar равно точно [self setFoo:bar].Все, что setFoo: сделает, будет выполнено (синтезированная сохраненная версия setFoo: работает, как описано выше).foo = bar равно точно foo = bar.

Все объекты внутри метода (включая параметры) сохраняются при создании / передаче и освобождаются при возврате метода.

Это совсем не так.Они не сохраняются и не освобождаются.Сохранение и освобождение не происходит волшебным образом.Это происходит в ответ на вызовы alloc, new, copy, retain с одной стороны и release с другой.Использование точечной нотации является всего лишь сокращением для вызова метода, который может содержать retain внутри него.

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

Это не так.Объект, возвращаемый методом, не будет ни сохранен, ни освобожден.По соглашению, метод с alloc, new или copy в его имени вернет сохранение +1.Любой другой метод вернет счет удержания net 0 (для объекта будет столько же авто-выпусков, сколько сохранений).«Текущий» счетчик хранения всегда будет больше 0, иначе объект не может быть возвращен.(Это небольшой проблеск правды. Число сохранений в любом случае может быть больше 1, если имеются частные сохранения. Но с точки зрения вызывающего абонента, это полезный способ подумать об этом.)

Лучшее место для поиска - Практическое управление памятью , в котором все изложено очень кратко.В остальной части Руководства по программированию управления памятью приведено больше примеров.

1 голос
/ 17 июня 2011

Термин «Автоматически» немного страшен. Это подразумевает, что удержание и освобождение каким-то волшебным образом применяются средой выполнения за кулисами. Действительно, единственный раз, когда что-то сохраняется, это когда ему отправляется сообщение, содержащее одно из следующего: Новый Alloc Сохранить Копировать (NARC). Единственный раз, когда это выпущено, является, когда это отправлено или сообщение выпуска или сообщение автоматического выпуска. Так что вам действительно нужно понять, в каких ситуациях отправляются эти методы?

1. Настройка свойств
Вы правы, насколько вы пошли. Зачем? Потому что свойства - это просто синтаксический сахар для генерации методов получения и установки. Например, self.myString = @"Foo"; абсолютно идентичен [self setMyString:@"Foo"]. Что вам нужно понять, так это то, что когда вы объявляете свойство с сохранением семантики, вам фактически предоставляется метод, который выглядит следующим образом:

- (void)setMyString:(NSString *)newString {
    if ( newString != myString ) {
        [myString release];
        myString = [newString retain];
    }
}

Таким образом, очевидно, что выражение self.myString = someOtherString приведет к сохранению нового значения. То, что вы называете «Установка свойства без self.», на самом деле является прямым назначением ivar. Поскольку точечный оператор не используется и, следовательно, метод не вызывается, вы знаете, что ничего не сохраняется.

2. и 3. Что делать с областью применения метода?
Ничто из этого не является правдой вообще. Соглашение говорит, что переменные, возвращенные моими методами без следов NARC в имени, будут автоматически освобождены. Это метод автора на самом деле следовать соглашению. Ничто не может автоматически сохраняться или освобождаться только в результате вызова метода.

...