Оскільки я просто стикаюся з цією проблемою під час редагування застарілого коду, я хочу робити додаткові примітки до існуючих відповідей, про які потрібно знати.
Навіть з більш новою версією компілятора іноді робить різницю , якщо опустити @synthesize propertyName
чи ні .
У випадку, якщо ви оголошуєте змінну екземпляра без підкреслення під час ще синтезування, наприклад:
Заголовок:
@interface SomeClass : NSObject {
int someInt;
}
@property int someInt;
@end
Впровадження:
@implementation SomeClass
@synthesize someInt;
@end
self.someInt
матиме доступ до тієї ж змінної, що і someInt
. Якщо використовувати провідне підкреслення для ivars, це не відповідає умовам іменування, але я просто потрапив у ситуацію, коли мені довелося читати та змінювати такий код.
Але якщо ви зараз думаєте, "Ей, @synthesize вже не важливий, оскільки ми використовуємо новіший компілятор", ви помиляєтеся! Тоді ваш клас матиме два івари , а саме someInt
плюс автогенеровану _someInt
змінну. Таким чином, self.someInt
і someInt
більше не буде звертатися до одних і тих же змінних. Якщо ви не очікуєте такої поведінки, як я це робив, це може отримати вам головний біль.