2010-06-04 16 views
8

CGRect-Typ ist ein Strukturtyp. Wenn ich eine Eigenschaft als diesen Typ definieren möchte, sollte ich Attribut für diesen Typ zuweisen oder beibehalten?CGRect var als Eigenschaftswert?

@interface MyClass { 
    CGRect rect; 
    ... 
} 
@property (nonatomic, assign) CGRect rect; // or retain? 

oder muss ich meinen eigenen Getter und Setter schreiben?

Antwort

17

Nur assign ist für Nicht-Objekte möglich. (Vor ARC, die Corefoundation Material enthält, zum Beispiel kann ein CFArrayRef nur assign sein.)

@property (nonatomic, assign) CGRect rect; 
//       ^^^^^^ don't forget. 

Sie keine benutzerdefinierten Getter und Setter müssen, wenn Sie nicht wollen, memcpy für die Zuordnung verwenden.

+0

Danke. Muss ich meine eigene Einstellung haben, um Feld für Feld im Code zuzuordnen? –

+0

@David: Wenn es sich um CGRect handelt, entspricht die Zuweisung von Feld zu Feld "memcpy". – kennytm

+0

Wie setzt man das Rect ... Es verwirrt mich – Morkrom

1
@property (assign) CGRect rect; 

CGrect ist eine Struktur, kein NSObject, so kann man nicht Nachricht an sie (wie retain) senden.

Sie sind voll Setup dann etwas sein wie:

// MyClass.h 
@interface MyClass : NSObject 
{ 
    CGRect _rect; 
} 

@property (assign) CGRect rect; 

und

// MyClass.m 
@implementation MyClass 

@synthesize rect=_rect; 

@end 

Also im Grunde kann man dann wie etwas tun:

MyClass *myClass = [[MyClass alloc] init]; 
myClass.rect = CGRectMake(0,0,0,0); 

Die synthesize Richtlinie grundsätzlich macht zwei Methoden (Getter/Setter) für Sie "hinter den Kulissen"; etwas wie ...

- (CGRect)rect; 
- (void)setRect:(CGRect)value; 

Ich füge normalerweise ein "_" zu meiner Instanz vars hinzu. Die rect=_rect weist den Compiler an, die _rect-Instanzvariable zu ändern, wenn die rect-Eigenschaft "aufgerufen" wird.

Lesen Sie these tutorials on Theocaco. Er erklärt, was das @synthesize (r) hinter den Kulissen macht.

+0

Das macht Sinn. Immer noch nicht sicher, was die generierten Codes für die Zuweisung, Speicher oder Feld für Feld sind? Ich habe meine Frage bearbeitet. –

Verwandte Themen