2010-06-04 6 views
8

Le type CGRect est un type de structure. Si je veux définir une propriété comme ce type, devrais-je utiliser assign ou retain attribute pour ce type?CGRect var comme valeur de propriété?

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

ou je dois écrire mon propre getter et setter?

Répondre

17

Seulement assign est possible pour les non-objets. (Avant ARC, qui inclut des choses CoreFoundation, par exemple, un CFArrayRef ne peut être assign.)

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

Vous n'avez pas besoin d'un getter personnalisé et régleurs à moins que vous ne souhaitez pas utiliser memcpy pour l'affectation.

+0

Merci. Ai-je besoin d'avoir mon propre réglage pour attribuer champ par champ dans le code? –

+0

@David: S'il s'agit de CGRect, l'affectation de champ par champ est équivalente à 'memcpy'. – kennytm

+0

Comment définissez-vous le rect ... Sa confusion me – Morkrom

1
@property (assign) CGRect rect; 

CGrect est un struct, pas un NSObject, de sorte que vous ne pouvez pas envoyer un message à lui (comme retain).

Vous êtes installation complète sera alors quelque chose comme:

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

@property (assign) CGRect rect; 

et

// MyClass.m 
@implementation MyClass 

@synthesize rect=_rect; 

@end 

Vous pouvez en principe faire quelque chose comme:

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

La directive synthétisent essentiellement fait deux méthodes (getter/setter) pour vous "dans les coulisses"; quelque chose comme ...

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

J'ai l'habitude d'ajouter un "_" à mes vars instance. Le rect=_rect indique au compilateur de modifier l'instance _rect var chaque fois que la propriété rect est appelée.

Avoir une lecture de these tutorials on Theocaco. Il explique ce que fait @synthesize (r) dans les coulisses.

+0

Cela a du sens. Vous ne savez toujours pas quels sont les codes générés pour effectuer l'assignation, la mémoire ou le champ par champ? J'ai édité ma question. –

Questions connexes