Nachdem ich vor etwas weniger als zwei Jahren einen Artikel mit dem demütigen Titel "Die Code-Gebote: Best Practices für die Objective-C-Codierung" von Robert McNally gelesen hatte, übernahm ich die Praxis, Eigenschaften für so ziemlich jedes Datenelement meiner Objective-C-Klassen zu verwenden ( das 3. Gebot ab Mai 2012). McNally listet diese Gründe dafür auf (meine Betonung):
- Eigenschaften erzwingen Zugriffsbeschränkungen (z. B. schreibgeschützt)
- Eigenschaften erzwingen die Speicherverwaltungsrichtlinie (stark, schwach)
- Eigenschaften bieten die Möglichkeit, benutzerdefinierte Setter und Getter transparent zu implementieren.
- Eigenschaften mit benutzerdefinierten Setzern oder Gettern können verwendet werden, um eine Thread-Sicherheitsstrategie durchzusetzen.
- Ein einziger Zugriff auf Instanzvariablen erhöht die Lesbarkeit des Codes.
Ich habe die meisten meiner Immobilien in private Kategorien eingeteilt, daher sind Nummer 1 und 4 normalerweise keine Probleme, auf die ich stoße. Die Argumente 3 und 5 sind eher "weich", und mit den richtigen Tools und anderen Konsistenzen könnten sie zu Problemen werden. Schließlich war für mich das einflussreichste dieser Argumente Nummer 2, die Speicherverwaltung. Ich mache das seitdem.
@property (nonatomic, strong) id object; // Properties became my friends.
Bei meinen letzten Projekten habe ich auf ARC umgestellt, was mich bezweifeln ließ, ob das Erstellen von Eigenschaften für so ziemlich alles noch eine gute Idee oder vielleicht ein wenig überflüssig ist. ARC kümmert sich für mich um die Speicherverwaltung von Objective-C-Objekten, was für die meisten strong
Mitglieder gut funktioniert, wenn Sie nur die ivars deklarieren. Die C-Typen, die Sie ohnehin vor und nach ARC manuell verwalten mussten, und die weak
Eigenschaften sind meist öffentliche.
Natürlich verwende ich immer noch Eigenschaften für alles, was Zugriff von außerhalb der Klasse benötigt, aber dies sind meist nur eine Handvoll Eigenschaften, während die meisten Datenelemente als ivars unter dem Implementierungsheader aufgeführt sind
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Als Experiment habe ich dies etwas strenger gemacht, und die Abkehr von den Eigenschaften für alles hat einige nette positive Nebenwirkungen.
- Die Anforderungen an den Datenelementcode (
@property
/@synthesize
) wurden auf die ivar-Deklaration reduziert. - Die meisten meiner
self.something
Referenzen wurden gerade aufgeräumt_something
. - Es ist leicht zu unterscheiden, welche Datenelemente privat (ivars) und welche öffentlich (Eigenschaften) sind.
- Schließlich fühlt es sich eher so an, als wäre dies der Zweck, für den Apple Eigenschaften vorgesehen hat, aber das ist subjektive Spekulation.
Weiter zur Frage : Ich rutsche langsam auf die dunkle Seite zu und verwende immer weniger Eigenschaften zugunsten von Implementierungs-Ivars. Können Sie mir ein paar Gründe nennen, warum ich bei der Verwendung von Eigenschaften für alles bleiben sollte, oder meinen aktuellen Gedankengang bestätigen, warum ich nur bei Bedarf mehr Ivars und weniger Eigenschaften verwenden sollte? Die überzeugendste Antwort für beide Seiten wird meine Note erhalten.
EDIT: McNally wiegt sich auf Twitter ein und sagt : "Ich denke, mein Hauptgrund für das Festhalten an Eigenschaften ist: Eine Möglichkeit, alles zu tun, die alles tut (einschließlich KVC / KVO)."