Використання властивості BOOL


111

Apple рекомендує оголосити властивість BOOL таким чином:

@property (nonatomic, assign, getter=isWorking) BOOL working;

Оскільки я використовую властивості Objective-C 2.0 та крапкові позначення, я отримую доступ до цієї властивості за допомогою self.working. Я знаю, що я також міг би скористатися, [self isWorking]але мені цього не потрібно.

Отже, оскільки я всюди використовую позначення крапок, чому я повинен визначати додаткову властивість? Було б добре просто написати

@property (nonatomic, assign) BOOL working;

Або я маю будь-які переваги getter=isWorkingв моєму випадку (використання крапкових позначень)?

Дякую!


4
Чи це не семантична рекомендація? тож myCar.isWorking був би семантично точнішим, ніж myCar.working
justcompile

Відповіді:


206

Apple просто рекомендує оголосити isXгеттер для стилістичних цілей. Не важливо, налаштовуєте ви ім'я геттера чи ні, якщо ви використовуєте позначення крапок або позначення повідомлення з правильним іменем. Якщо ви збираєтесь використовувати позначення крапок, це не має ніякого значення, ви все одно отримаєте до нього ім'я властивості:

@property (nonatomic, assign) BOOL working;

[self setWorking:YES];         // Or self.working = YES;
BOOL working = [self working]; // Or = self.working;

Або

@property (nonatomic, assign, getter=isWorking) BOOL working;

[self setWorking:YES];           // Or self.working = YES;, same as above
BOOL working = [self isWorking]; // Or = self.working;, also same as above

4
Напевно, це більше стосується того, що кодування ключового значення сумісне, ніж просто стилістичні цілі?
Jasarien

5
Дещо дивно, що Apple рекомендує оголосити цих користувачів, isXале Xcode не в змозі перерахувати їх у спливаючому вікні автоматичного завершення. (У моєму прикладі) workingвказаний там, але isWorkingце не так. Тож я не бачу жодних переваг у оголошенні бутлерів BOOL. Мені доводиться робити більше, щоб мати можливість їх використовувати (оголосити про те, що отримує), але я отримую менше (немає автоматичного завершення).
Патрік

4

Apple рекомендує для стилістичних цілей. Якщо ви пишете цей код:

@property (nonatomic,assign) BOOL working;

Тоді ви не можете використовувати [object isWorking].
Він покаже помилку. Але якщо ви використовуєте код нижче, це означає

@property (assign,getter=isWorking) BOOL working;

Таким чином, ви можете використовувати [object isWorking].


-26

Немає користі від використання властивостей із примітивними типами. @propertyвикористовуються з купою виділеної , NSObjectsяк NSString*, NSNumber*, UIButton*, і т.д., тому що пам'ять вдався аксессор створені безкоштовно. Коли ви створюєте BOOL, значення завжди виділяється на стеку і не потребує спеціальних аксесуарів для запобігання витоку пам'яті. isWorkingпросто популярний спосіб вираження стану булевого значення.

Іншою мовою ОО ви можете зробити змінну private bool working;та два аксесуари: SetWorkingдля сетера та IsWorkingдля аксесуара.


1
Ви не відповідаєте на його запитання, а саме в тому, яка мета явного назви getter чимось іншим, ніж властивість (він не запитує, чи властивості є гарною ідеєю). Крім того, властивості дозволяють використовувати KVO та KVC, тому пункт, який ви робите, вводить в оману.
Мартін Гяльдбек

Ви маєте рацію, що я не помітив використання КВО та КВК із примітивними властивостями. Я думаю, що кожен з ниток вирішує своє питання щодо isWorking - це конвенція про іменування.
Thomson Comer

25
Це абсолютно неправильно; @propertyдуже призначений для використання з примітивними типами і, лише заради послідовності, має значні переваги. Крім того, деякі примітивні типи (64-бітні типи на 32-бітових процесорах та 128-бітні типи на багатьох 32 та 64-бітних процесорах) є неатомними за призначенням; @propertyАтомність може бути вигідною і в цих випадках.
bbum

1
Цікаво - але як, до біса, я повинен це знати? :) Є чи це неявно з atomicі nonatomicатрибутів?
Thomson Comer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.