Verwenden einer BOOL-Eigenschaft


110

Apple empfiehlt, eine BOOL-Eigenschaft folgendermaßen zu deklarieren:

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

Da ich Objective-C 2.0-Eigenschaften und Punktnotation verwende, greife ich mit auf diese Eigenschaft zu self.working . Ich weiß, dass ich auch gebrauchen könnte [self isWorking]- aber ich muss nicht.

Warum sollte ich eine zusätzliche Eigenschaft definieren, da ich überall die Punktnotation verwende? Wäre es in Ordnung, einfach zu schreiben?

@property (nonatomic, assign) BOOL working;

Oder habe ich getter=isWorkingin meinem Fall irgendwelche Vorteile beim Schreiben (Verwendung der Punktnotation)?

Vielen Dank!


4
Ist das nicht eine semantische Empfehlung? myCar.isWorking wäre also semantisch genauer als myCar.working
kompilieren

Antworten:


205

Apple empfiehlt lediglich, einen isXGetter für stilistische Zwecke zu deklarieren . Es spielt keine Rolle, ob Sie den Getter-Namen anpassen oder nicht, solange Sie die Punktnotation oder die Nachrichtennotation mit dem richtigen Namen verwenden. Wenn Sie die Punktnotation verwenden, macht dies keinen Unterschied. Sie greifen dennoch über den Eigenschaftsnamen darauf zu:

@property (nonatomic, assign) BOOL working;

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

Oder

@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
Sicherlich hat es mehr damit zu tun, dass die Schlüsselwertcodierung konform ist als nur mit stilistischen Zwecken?
Jasarien

5
Es ist ein bisschen seltsam, dass Apple empfiehlt , diese isXGetter zu deklarieren, aber Xcode kann sie nicht im Popup für die automatische Vervollständigung auflisten. (In meinem Beispiel) workingist dort aufgeführt, isWorkingist es aber nicht. Ich sehe also keine Vorteile darin, BOOL-Getter zu deklarieren. Ich muss mehr tun, um sie verwenden zu können (deklariere den Getter), aber ich bekomme weniger (keine automatische Vervollständigung).
Patrick

4

Apple empfiehlt aus stilistischen Gründen. Wenn Sie diesen Code schreiben:

@property (nonatomic,assign) BOOL working;

Dann können Sie [object isWorking] nicht verwenden.
Es wird ein Fehler angezeigt. Aber wenn Sie unten Code verwenden, bedeutet

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

Sie können also [object isWorking] verwenden.


-26

Die Verwendung von Eigenschaften mit primitiven Typen hat keinen Vorteil. @propertywird mit Heap zugewiesen verwendet NSObjectswie NSString*, NSNumber*, UIButton*, und usw., weil der Speicher verwaltet Accessoren erstellt werden kostenlos. Wenn Sie a erstellen BOOL, wird der Wert immer auf dem Stapel zugewiesen und erfordert keine speziellen Accessoren, um einen Speicherverlust zu verhindern. isWorkingist einfach die beliebte Art, den Zustand eines Booleschen Wertes auszudrücken.

In einer anderen OO-Sprache würden Sie eine Variable private bool working;und zwei Accessoren erstellen: SetWorkingfür den Setter und IsWorkingfür den Accessor.


1
Sie beantworten seine Frage nicht, nämlich was ist der Zweck, Getter explizit etwas anderes als die Eigenschaft zu nennen (er fragt nicht, ob Eigenschaften eine gute Idee sind). Außerdem ermöglichen Eigenschaften KVO und KVC, sodass der Punkt, den Sie ansprechen, irreführend ist.
Martin Gjaldbaek

Sie haben Recht, dass ich die Verwendung von KVO und KVC mit primitiven Eigenschaften übersehen habe. Ich denke, jeder im Thread spricht seine Frage zu isWorking an - es ist eine Namenskonvention.
Thomson Comer

25
Das ist völlig falsch; @propertyist sehr für die Verwendung mit primitiven Typen gedacht und hat allein aus Gründen der Konsistenz erhebliche Vorteile. Darüber hinaus sind einige primitive Typen (64-Bit-Typen auf einigen 32-Bit-CPUs und 128-Bit-Typen auf vielen 32- und 64-Bit-CPUs) bei der Zuweisung nicht atomar. @propertyAuch in diesen Fällen kann die Atomizität von Vorteil sein.
bbum

1
Interessant - aber wie zum Teufel soll ich das wissen? :) Ist das eine Implizität der atomicund nonatomicAttribute?
Thomson Comer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.