Термин «Автоматически» немного страшен. Это подразумевает, что удержание и освобождение каким-то волшебным образом применяются средой выполнения за кулисами. Действительно, единственный раз, когда что-то сохраняется, это когда ему отправляется сообщение, содержащее одно из следующего: Новый 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 в имени, будут автоматически освобождены. Это метод автора на самом деле следовать соглашению. Ничто не может автоматически сохраняться или освобождаться только в результате вызова метода.