2009-01-08 14 views
17

Ich habe Probleme zu verstehen, wenn Eigenschaften in Objective C 2.0 verwendet werden. Es scheint, dass Sie keine Eigenschaft für einen primitiven Typ benötigen wie: int, bool, float. Ist das wahr? Ich habe Beispiele gesehen, die Eigenschaften für diese Typen zeigen und andere, die sie auslassen. Zum Beispiel in der Probe von Apple Code, den sie haben:Verwendung von Eigenschaften für primitive Typen

... 
@interface Book : NSObject { 
    // Primary key in the database. 
    NSInteger primaryKey; 
    // Attributes. 
    NSString *title; 
    NSDate *copyright; 
    NSString *author; 

    BOOL hydrated; 
    BOOL dirty; 
    NSData *data; 
} 

@property (assign, nonatomic, readonly) NSInteger primaryKey; 
// The remaining attributes are copied rather than retained because they are value objects. 
@property (copy, nonatomic) NSString *title; 
@property (copy, nonatomic) NSDate *copyright; 
@property (copy, nonatomic) NSString *author; 
... 

Apple SQLite Book List Sample Code

So wie Sie sehen können sie keine Eigenschaft für BOOL verwenden, aber sie behandeln es eine Instanzvariable in der gesamten Implementierungsdatei hat, Lesen des Wertes und Einstellen des Wertes. Online suchen Ich habe Lernprogramme gefunden, die Eigenschaften für diese Typen verwenden, wie zum Beispiel: (@property BOOL flag). Kann jemand für mich dieses Thema beleuchten? Vielen Dank.

Antwort

34

Ja, Sie sollten eine Eigenschaft für primitive Typen deklarieren. Der einzige wirkliche Unterschied ist, dass Sie assign verwenden sollten (was der Standard ist, also können Sie es auch weglassen) anstatt zu kopieren oder zu behalten. Ich kann nicht für den Rest des Beispiels sprechen, aber es greift wahrscheinlich direkt auf die interne Instanzvariable zu, oder wenn auf sie von einem anderen Klassenschlüssel zugegriffen wird, erzeugt die Kodierung einen Accessor (was eine wirklich schlechte Form ist). Ich schätze, es ist Ersteres; Wenn ich keinen speziellen Accessor brauche und die Instanzvariable nicht außerhalb der Klasse verwendet wird, werde ich direkt darauf verweisen, anstatt eine Eigenschaft zu deklarieren. Manche Leute mögen dagegen argumentieren, aber es scheint mir ein wenig übertrieben.

+0

Danke Marc.Yeah, ich benutzte Eigenschaften für so ziemlich alles und war nur schrubben durch meine Klassen und sicherzustellen, dass es korrekt war. Ich habe den Link zu dem Apple-Beispielcode hinzugefügt, auf den ich mich in meiner Frage bezog. Aber es scheint, dass sie direkt darauf zugreifen (nicht durch selbst.dirty). – Sean

+3

Ja, ich stimme zu, dass keine Eigenschaften für Primitive benötigt werden, wenn keine Notwendigkeit besteht. Wenn Sie außerhalb Ihrer Klasse darauf zugreifen müssen, benötigen Sie eine Eigenschaft. – mk12

+1

Eine weitere Verwendung von Eigenschaften ist die Vereinfachung der Speicherverwaltung. In dealloc können Sie self.ivar1 = nil anstelle von [ivar1 release] haben; ivar1 = null; Keine große Veränderung, aber immer noch eine gute Angewohnheit, die den Code der Speicherverwaltung vereinfacht. Primitive brauchen das nicht, aber ich dachte, ich würde erklären, wo Eigenschaften nach deinem Kommentar nützlich sind. – Luke

Verwandte Themen