Там нет резаного ответа. Однако помните, что преждевременная оптимизация - это плохо. В Какао на Mac или на iPhone использование аксессоров / свойств должно быть KVO-совместимым. Соответствие KVO необходимо, чтобы базовые данные и привязки какао функционировали автоматически. В Core Data необходимо обеспечить не только KVO при изменении свойств, но и при доступе к ним.
Также лучше использовать аксессоры / свойства, когда вы хотите обеспечить поведение управления памятью свойств, то есть всегда при установке ивара для использования установщика или точечной нотации и в зависимости от того, какой шаблон управления памятью вы используете, всегда использовать аксессоры / свойства при получении ivar.
Существует несколько различных шаблонов управления памятью. Все неразрушенные объекты гарантируют, что объект, возвращенный средством доступа, будет существовать, по крайней мере, до конца текущей области автоматического выпуска. Это означает, что либо объект явно сохраняется и автоматически высвобождается в текущей области автоматического выпуска. Метод, рекомендованный Apple, делает это явно в геттере:
- (id)foo {return [[foo retain] autorelease]; }
- (void)setFoo:(id)aFoo {
if(! [aFoo isEqual:foo]) {
[foo release];
foo = [aFoo retain];
}
}
Подразумевается, что это шаблон, которому они следуют в своих синтезированных средствах доступа. Лично я предпочитаю авто-релиз в сеттере:
- (id)foo {return foo;}
- (void)setFoo:(id)aFoo {
[foo autorelease];
foo = [aFoo retain];
}
Это автоматически освобождает старое значение перед его заменой новым значением. Это имеет тот же эффект, что и сохранение и автоматическое освобождение в геттере, но требует, чтобы объект был добавлен в пул автоматического выпуска только один раз. Большую часть времени он имеет счетчик единиц и не выпускается автоматически, поэтому он никуда не денется, что бы ни случилось. Если свойство заменяется во время какого-то кода, который все еще удерживает его (например, в обратном вызове делегата), оно не исчезнет из-под него.
Это означает, что использование аксессоров / свойств даст вам уверенность в том, что ваши объекты будут существовать столько, сколько вам нужно, без какой-либо другой части кода, высвобождающей их из-под вас.
Последняя и лучшая причина всегда использовать аксессоры / свойства заключается в том, что для каждого свойства делается одно меньшее предположение: для этого свойства существует базовый ivar, и он имеет одно и то же имя (я полагаю, это два предположения). Возможно, в будущем вы захотите заменить ивар на производное средство доступа. Обозначение свойства все еще будет работать. Возможно, вы хотите переименовать ивар; собственность все еще будет работать. К счастью, на рефакторинг в Xcode обычно можно положиться, но зачем вообще беспокоиться?
Смысл объектно-ориентированного программирования - использовать интерфейсы, определенные в классе. Нет веской причины (хотя есть много предубежденных и рационализированных) для класса игнорировать свой собственный интерфейс. Каждый метод, за исключением самих методов доступа, должен в общем случае трактовать объект как священный, а его внутреннее состояние - как частное. Напишите каждый метод, как если бы он находился в категории или в подклассе, и рассматривайте ivars как частное состояние, если конкретный дизайн не требует, чтобы вы поступили иначе. Существует множество веских причин для прямого доступа к иварам, но они определяются в каждом конкретном случае.