Когда вы делаете:
@property (nonatomic, retain) NSString *aString;
... а затем:
@synthesize aString;
... ваш класс получает три основных вещи:
- Переменная-экземпляр с именем
aString
, на которую вы можете ссылаться непосредственно в вашем классе.
- Функция получения с сигнатурой
- (NSString*) aString;
, которая возвращает переменную экземпляра.
- Функция установки с сигнатурой
- (void) setAString: (NSString*) value;
, которая сохраняет передаваемый параметр и присваивает его переменной экземпляра (и освобождает любое ранее сохраненное значение, если оно существует);
С точки зрения реализации эти сгенерированные методы и поля могут выглядеть следующим образом:
//in the .h file
@interface MyClass {
NSString* aString;
}
- (NSString*) aString;
- (void) setAString: (NSString*) value;
@end
//in the .m file
@implementation MyClass
- (NSString*) aString {
return aString;
}
- (void) setAString: (NSString*) value {
if (aString != value) {
[aString release];
aString = [value retain];
}
}
@end
Итак, чтобы ответить на остальные ваши вопросы:
self.aString = @"My New String"; // This will use the setter? Yes, and it will retain the string.
aString = @"My new String"; //This will not use the setter and retain the string, right? Right.
aString = [@"My new string" retain]; //This will not use the setter, but it will retain the string? Right again.
[self setAString:@"My new string"]; //This will also use the setter? Yep.
Что касается того, что является правильным, все они, в зависимости от того, что вы хотите, и предполагают, что вы понимаете, как поведение отличается при использовании каждого из них, особенно в отношении освобождения / сохранения значений свойств. Например, этот код будет пропускать память:
self.aString = @"Value 1"; //go through the setter, which retains the string
aString = @"Value 2"; //bypass the setter, the 'Value 1' string will not be released
... и этот эквивалентный код не будет:
self.aString = @"Value 1"; //go through the setter, which retains the string
self.aString = @"Value 2"; //go through the setter again to release the first string