2009-09-10 12 views
9

Ist es schlecht, @properties für private Variablen nur für die Vorteile der Speicherverwaltung zu erstellen?Ist es "schlecht", @properties für private Variablen nur für die Vorteile der Speicherverwaltung zu verwenden?

Es scheint chaotisch und falsch, @properties für viele private Variablen öffentlich zugänglich zu machen.

(Hauptsächlich ist ich die Freigabe private ivars bei niedrigeren Speicherbedingungen der jeweiligen "Ereignis" Methoden.)

Beispiel:

[name release]; name = nil; 
:
mir dies in der Regel noch eine private Ivar lösen

Aber mit @properties, kann ich dies tun:

self.name = nil; 

Später in meinem Code, wird dies tun, damit die Notwendigkeit, auf Null zu setzen:

if(!name) 
    name = [[NSString alloc] initWithFormat:@"Hi %@",inputName]; 

Antwort

23

Eine Alternative ist, das Eigentum privat zu halten. Sie können den folgenden Code (in .m-Datei) verwenden, das Eigentum nur zugänglich in Ihrer Klasse zu machen:

#import "MyClass.h" 

@interface MyClass() 
    @property (retain) NSString* privateString; 
@end 

@implementation MyClass 

    @synthesize privateString; 
    // Your code here 

@end 

Jetzt haben Sie die Leichtigkeit einer Eigenschaft bekommen, aber auch andere Klassen können es immer noch nicht zugreifen , selbst wenn sie Ihre .h-Datei importieren!

+0

Das ist großartig, aber es scheint wie ein Hack. Ich bin mir nicht sicher, ob ich das in meinem Code machen werde, aber zumindest weiß ich, dass es eine Alternative zu dem gibt, was ich gerade mache. Vielen Dank!! – bentford

+13

Es ist kein Hack, es ist eine explizite Form der Kategorie namens Extension. . "Es ist üblich, dass eine Klasse eine öffentlich deklarierte API hat und dann eine zusätzliche API privat für die ausschließliche Verwendung durch die Klasse oder das Framework, in dem sich die Klasse befindet, deklariert" –

+5

Es ist absolut kein Hack und ist 100% im Einklang mit warum Klassenerweiterungen der Sprache überhaupt hinzugefügt wurden. Umfassen Sie dieses Muster mit Begeisterung. – bbum

0

Für öffentliche Eigenschaften Ich glaube nicht, Apple empfiehlt es, weil manchmal eine Eigenschaft auf Null Einstellung Nebenwirkungen andere als nur die Variable (KVO Benachrichtigungen Freigabe haben kann, oder eine benutzerdefinierte Setter-Methode, die etwas anderes macht).

Wie für private Immobilien, bin ich mir nicht sicher. Wenn Sie eine Eigenschaft verwenden, werden Sie beim Codieren nur ein paar Schlüsselstriche speichern, aber Sie machen es auch etwas komplexer und fragiler. Ich bevorzuge Lesbarkeit und Wartungsfreundlichkeit gegenüber der Bequemlichkeit zu schreiben, weil Sie auf lange Sicht Zeit sparen.

+0

Zitat aus Apple-Dokumentation in UIViewController Klassenreferenz für Methode - (void) viewDidUnload: "Die bevorzugte Möglichkeit, Besitz eines Objekts (einschließlich der in Steckdosen) aufzugeben, ist die entsprechende Accessor-Methode, um den Wert der festlegen Objekt zu Null " – bentford

+0

Ich schaute mich um, um den ursprünglichen Grund zu finden, warum ich dachte, dass es schlecht war (weil ich es vergessen hatte), und ich fand das: http://stackoverflow.com/questions/192721/why-shouldnt-i-use-use- obective-c-2-0-Accessoren-in-init-dealloc. Es scheint, dass es nur ein Anliegen in init oder dealloc ist. –

2

Eigenschaften existieren für Ihre Bequemlichkeit. Wenn Sie nicht möchten, dass andere Personen Eigenschaften verwenden, die in Ihren Klassen vorhanden sind, dokumentieren Sie sie nicht.

+1

Aber sie sind in Ihrer .h-Datei sichtbar. andyvn22 hat dafür eine alternative Lösung. – bentford

Verwandte Themen