2010-06-04 11 views
8

El tipo de CGRect es un tipo de estructura. Si quiero definir una propiedad como este tipo, ¿debo usar asignar o retener atributo para este tipo?CGRect var como valor de propiedad?

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

o tengo que escribir mi propio getter y setter?

Respuesta

17

Solo assign es posible para no objetos. (Antes de ARC, que incluye CoreFoundation cosas, por ejemplo, un CFArrayRef sólo puede ser assign.)

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

No es necesario un captador costumbre y la moda a menos que no desee utilizar memcpy para la asignación.

+0

Gracias. ¿Debo tener mi propia configuración para asignar campo por campo en el código? –

+0

@David: si es CGRect, la asignación de campo por campo es equivalente a 'memcpy'. – kennytm

+0

¿Cómo se configura el rect ... Me confunde – Morkrom

1
@property (assign) CGRect rect; 

CGrect es una estructura, no un NSObject, por lo que no puede enviar mensaje a ella (como retain).

Eres configuración completa, entonces será algo como:

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

@property (assign) CGRect rect; 

y

// MyClass.m 
@implementation MyClass 

@synthesize rect=_rect; 

@end 

Así que, básicamente, a continuación, puede hacer algo como:

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

La directiva sintetizan básicamente hace dos métodos (getter/setter) para usted "detrás de la escena"; algo así como ...

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

Normalmente agrego un "_" a mi instancia vars. El rect=_rect le está diciendo al compilador que modifique la instancia _rect var siempre que se llame a la propiedad rect.

Lea a través de these tutorials on Theocaco. Él explica lo que el @synthesize (r) está haciendo detrás de las escenas.

+0

Eso tiene sentido. Todavía no estoy seguro de cuáles son los códigos generados para hacer la asignación, memoria o campo por campo? Edité mi pregunta. –

Cuestiones relacionadas