Ответ 1
Номер 1 отличается от двух других форвардом, объявляющим класс MyOtherObject, чтобы свести к минимуму количество кода, наблюдаемое компилятором и компоновщиком, а также потенциально избежать круговых ссылок. Если вы сделаете это так, не забудьте поставить #import в файл .m.
Объявляя @property (и сопоставляя @synthesize в .m) файле, вы автоматически генерируете методы доступа с семантикой памяти, обрабатываемой вами, как вы указываете. Эмпирическое правило для большинства объектов - Retain, но NSStrings, например, должны использовать Copy. В то время как синглтоны и делегаты должны обычно использовать 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
Общая боль в прикладе, право. Теперь сделайте это для каждого ivar в классе. Если вы не сделаете это точно, вы получите утечку памяти. Лучше всего позволить компилятору выполнить эту работу.
Я вижу, что Номер 1 не имеет ivar. Предполагая, что это не опечатка, это прекрасно, потому что директивы @property/@synthesize объявят вам ивуар для вас, за кулисами. Я считаю, что это ново для Mac OS X - Snow Leopard и iOS4.
Номер 3 не содержит этих аксессуаров, поэтому вы должны сами написать их. Если вы хотите, чтобы ваши аксессуарные методы имели побочные эффекты, вы делаете свой стандартный танец управления памятью, как показано выше, а затем выполняйте любую работу на стороне, в которой вы нуждаетесь, внутри метода доступа. Если вы синтезируете свойство, а также напишите свой собственный, то ваша версия имеет приоритет.
Я покрыл все?