Число 1 отличается от двух других прямым объявлением класса MyOtherObject, чтобы минимизировать объем кода, видимого компилятором и компоновщиком, а также потенциально избежать циклических ссылок. Если вы делаете это таким образом, не забудьте поместить #import в файл .m.
Объявляя @property (и сопоставляя @synthesize в .m) файле, вы автоматически генерируете методы доступа с семантикой памяти, обработанной так, как вы укажете. Основное правило для большинства объектов - Retain, но, например, NSStrings должен использовать Copy. Принимая во внимание, что Singletons и Делегаты обычно должны использовать Assign. Аксессуар для рукописного ввода утомителен и подвержен ошибкам, так что это избавляет от множества ошибок при наборе текста.
Кроме того, объявление синтезированного свойства позволяет вам вызывать метод доступа с использованием точечной нотации, например:
self.otherObj = someOtherNewObject; // set it
MyOtherObject *thingee = self.otherObj; // get it
Вместо обычного способа передачи сообщений:
[self setOtherObject:someOtherNewObject]; // set it
MyOtherObject *thingee = [self otherObj]; // get it
За кадром вы действительно вызываете метод, который выглядит следующим образом:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject; // keep a reference to the old value for a second
otherObject = [anOtherObject retain]; // put the new value in
[oldOtherObject release]; // let go of the old object
} // set it
… или это
- (MyOtherObject *) otherObject {
return otherObject;
} // get it
Полная боль в заднице, верно. Теперь сделайте это для каждого ивара в классе. Если вы не сделаете это правильно, вы получите утечку памяти. Лучше всего, чтобы компилятор сделал всю работу.
Я вижу, что Число 1 не имеет ивара. Предполагая, что это не опечатка, это нормально, потому что директивы @property / @synthesize объявят ивар для вас также, за кулисами. Я считаю, что это новое для Mac OS X - Snow Leopard и iOS4.
Number 3 не генерирует эти средства доступа, поэтому вы должны написать их самостоятельно. Если вы хотите, чтобы ваши методы доступа имели побочные эффекты, вы выполняете свой стандартный танец управления памятью, как показано выше, а затем выполняете любую побочную работу внутри метода доступа. Если вы синтезируете свойство и напишите свой собственный , тогда ваша версия будет иметь приоритет.
Я все покрыл?