Номер 1 відрізняється від решти двох попереднім оголошенням класу MyOtherObject, щоб мінімізувати кількість коду, побаченого компілятором і компонувальником, а також потенційно уникати кругових посилань. Якщо ви робите це таким чином, не забудьте вставити #import у файл .m.
Оголошуючи @property, (і збігаючи @synthesize у файлі .m), ви автоматично генеруєте методи доступу з використанням семантики пам'яті, як ви вказуєте. Емальним правилом для більшості об’єктів є Retain, але NSStrings, наприклад, повинен використовувати Copy. Тоді як одноосібники та представники зазвичай повинні використовувати Assign. Доступ до рукописного тексту є нудним та схильним до помилок, тому це економить багато набору тексту та безглуздих помилок.
Крім того, оголошення синтезованого властивості дозволяє вам викликати метод доступу, використовуючи крапкові позначення, як це:
self.otherObj = someOtherNewObject;
MyOtherObject *thingee = self.otherObj;
Замість звичайного способу передачі повідомлень:
[self setOtherObject:someOtherNewObject];
MyOtherObject *thingee = [self otherObj];
За лаштунками ви дійсно називаєте метод, який виглядає так:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject;
otherObject = [anOtherObject retain];
[oldOtherObject release];
}
... або це
- (MyOtherObject *) otherObject {
return otherObject;
}
Тотальний біль у попі, праворуч. Тепер зробіть це для кожного івара в класі. Якщо ви робите це не зовсім правильно, ви отримуєте витік пам'яті. Найкраще просто дозволити компілятору виконувати роботу.
Я бачу, що номер 1 не має івару. Якщо припустити, що це не друкарська помилка, це добре, оскільки директиви @property / @synthesize також оголосять ivar для вас, і за кадром. Я вважаю, що це нове для Mac OS X - Snow Leopard та iOS4.
У номері 3 не створено цих аксесуарів, тому вам доведеться писати їх самостійно. Якщо ви хочете, щоб ваші методи доступу мали побічні ефекти, ви виконуєте свій стандартний танець управління пам'яттю, як показано вище, а потім виконуйте будь-яку необхідну побічну роботу всередині методу доступу. Якщо ви синтезуєте властивість , а також пишете свою , тоді ваша версія має пріоритет.
Я все покрив?