2010-04-11 17 views
8

Estoy tratando de abrirme camino a través de un tutorial de Objective-C. En el libro hay este ejemplo:Objective-C getter/setter

@interface 
{ 
int width; 
int height; 
XYPoint *origin; 
} 
@property int width, height; 

pensé: ". Bueno no hay captador/definidor de objeto Xypoint El código funciona aunque" Ahora voy a responder mi propia pregunta :).

Yo piensa que es porque "origen" es un puntero ya, y qué está sucediendo bajo el capó con el "ancho" y "alto", es que no te va crear un puntero a ellos ..

Am estoy bien, o estoy hablando BS :)?

Simplemente no lo entiendo. aquí es principal:

#import "Rectangle.h" 
#import "XYPoint.h" 
int main (int argc, char *argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Rectangle *myRect = [[Rectangle alloc] init]; 
    XYPoint *myPoint = [[XYPoint alloc] init]; 

    [myPoint setX: 100 andY: 200]; 
    [myRect setWidth: 5 andHeight: 8]; 

    myRect.origin = myPoint; 

    NSLog (@"Rectangle w = %i, h = %i", 
      myRect.width, myRect.height); 

    NSLog (@"Origin at (%i, %i)", 
      myRect.origin.x, myRect.origin.y); 

    NSLog (@"Area = %i, Perimeter = %i", 
      [myRect area], [myRect perimeter]); 

    [myRect release]; 
    [myPoint release]; 
    [pool drain]; 

    return 0; 
} 

Y aquí está el objeto Rectangle:

#import "Rectangle.h" 
#import "XYPoint.h" 

@implementation Rectangle 
@synthesize width, height; 

-(void) setWidth: (int) w andHeight: (int) h 
{ 
    width = w; 
    height = h; 
} 

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 
-(int) area 
{ 
    return width * height; 
} 
-(int) perimeter 
{ 
    return (width + height) * 2; 
} 
-(XYPoint *) origin 
{ 
    return origin; 
} 
@end 

Lo que yo no entiendo es esta línea en principal: myRect.origin = myPoint; no hice un regulador para ello ..

Por cierto, gracias para su respuesta rápida

Respuesta

20

Lo que yo no entiendo es esta línea en principal: Hay myRect.origin = myPoint; no hice un regulador para ello ..

es tanto un getter y setter (denominados colectivamente como descriptores de acceso ) creado para origin en la clase Rectangle.Si usted tiene una mirada en la implementación de Rectangle, este es el captador:

-(XYPoint *) origin 
{ 
    return origin; 
} 

y este es el colocador:

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 

Y a partir de Objective-C 2.0 vocación:

myRect.origin = myPoint; 

es equivalente a:

[myRect setOrigin:myPoint]; 

Declarar getters y setters usando @property (y luego implementarlos usando @synthesize) es solo una forma de declarar y crear descriptores de acceso, y está ahí para su comodidad si tiene muchas propiedades para declarar en la interfaz de clase. Como se ha dicho Schildmeijer, @property int width es equivalente a declarar dos métodos:

- (int)width; 
- (void)setWidth:(int)newWidth; 

Debido a la naturaleza dinámica con destino de las llamadas a métodos de Objective-C, que ni siquiera tiene para declarar los métodos getter y setter en el interfaz, aunque en general es una buena práctica hacerlo si los anuncia como disponibles públicamente para otras clases.

6

Puede pensar en una declaración de propiedad como equivalente a declarar dos métodos de acceso. Por lo tanto

@property int width; 

es equivalente a:

- (int)width; 

- (void)setWidth:(int)newWidth; 
0

Usted no dice qué código está trabajando, o cuáles son sus expectativas para "trabajar".

La interfaz anterior creará métodos de acceso simples para ancho y alto que pueden llamarse desde otros objetos como [object setWidth:1]; o object.width = 1; - estos dos son análogos.

El origen es otro tipo de objeto y es un puntero, sí. Pero aún desea declarar una propiedad para que genere métodos de acceso.

0

Los getters y setters son principalmente útiles si necesita acceder a una variable de instancia de otra clase o si está utilizando enlaces para obtenerlos/configurarlos. Así que supongo que necesita esta funcionalidad para el ancho y la altura, pero no para el origen. Tenga en cuenta que los getters/setters no hacen punteros a partir de los enteros como usted indicó podría ser el motivo. Los Ints son ints y getters/setters no cambian eso.

0
//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property int Width; 
@property int Height; 
-(int)Area; 
@end 

//Rectangle.m 
#import "Rectangle.h" 
@implementation Rectangle 
@synthesize Width;/*Will create value Width , Setter called"setWidth" and Getter called "Width"*/ 
@synthesize Height;/*Will create value Height , Setter called"setHeight" and Getter called "Height"*/ 

-(int)Area 
{ 
    return Width*Height; 
} 
@end 


// main.m 
#import <Cocoa/Cocoa.h> 
#import "Rectangle.h" 
int main(int argc, const char * argv[]) 
{ 
    Rectangle *myRectangle = [Rectangle new]; 

    myRectangle.Width=3; 
    myRectangle.Height=5; 
    printf("Area = %d\n",[myRectangle Area]); 

    //Or 
    [myRectangle setWidth:5]; 
    [myRectangle setHeight:6]; 
    printf("Area = %d\n",[myRectangle Area]); 

} 

Si desea hacer Getter única o renombrar getter y setter

• sólo lectura

• captador = newGetterName

• colocador = new SetterName

ejemplo

//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property (getter = getWidth) int Width; 
@property (readonly) int Height; 
@end 
Cuestiones relacionadas