2010-07-03 19 views

Respuesta

13

Objective-C Runtime Programming Guide: Declared Properties

@property declara el getter y los métodos setter para la propiedad pública que desea implementar. Por ejemplo, esta declaración de propiedad:

@property float value; 

es equivalente a:

- (float)value; 
- (void)setValue:(float)newValue; 

@synthesize proporciona implementación por defecto para estos dos métodos de acceso.

Actualización: Lo anterior explica lo que hacen estos dos. No explica cuál es su propósito. :-)

  • @property agrega un miembro a la interfaz pública que actúa como una variable de datos a sus clientes de clase, pero se leen y se escriben utilizando métodos. Esto le da un mejor control sobre los datos intercambiados entre el cliente y su código, por ejemplo, puede hacer una validación extendida de los valores que le da su código.
  • @synthesize le permite no escribir explícitamente el código que será llamado por el cliente y tratar la propiedad como una variable de datos usted mismo.
+0

No sé si entendí completamente esto ... ¿por qué no simplemente hacer: value = 0.0; – esqew

+0

@ seanny94 Consulte esta pregunta: http://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

+0

La respuesta es parcialmente errónea. @property declara un getter (y/o setter). También declara algunos aspectos del comportamiento del getter/setter (por ejemplo, retener, copiar, asignar, no atómico). @synthesize proporciona una implementación predeterminada de los accesadores basados ​​en @property. Ninguno de estos le permite tratar la propiedad como un miembro de datos más que escribir las declaraciones y definiciones de métodos estándar. – JeremyP

0

Sólo un rápido ejemplo de por qué es posible que no desee hacer sólo "variable = 0":

Digamos que tiene esta propiedad:

@property (nonatomic, retain) id <MyDelegate> theDelegate; 

Siempre que sustituya ese delegado con una nueva uno, sus setters y getters sintetizados se encargará de la liberación/retener para usted cada vez que se configura de este modo:

self.theDelegate = newObject; 

Realmente lo que hap Penedès fue la siguiente:

[self setTheDelegate:newObject]; 

- (void)setTheDelegate:(id <MyDelegate>)anObject { 
    [theDelegate release]; 
    theDelegate = [anObject retain]; 
} 

(Esto se simplifica por supuesto)

Se pueden hacer cosas muy potentes en sus propias incubadoras y captadores, sintetizar es para los que suceden una y otra propiedades retenidas como, etc. Al compilar, mira tu @property y construye los métodos en consecuencia.

3

El símbolo "@" es interpretado por el compilador como una directiva. Esta es una de las "adiciones" de Objective-C al lenguaje C. Cuando declaras @property y luego @synthesize estás instruyendo al compilador que cree las instrucciones y los símbolos correspondientes para getters y setters para ti. Recuerde que en el lenguaje C, el operador "=" significa "asignar". La mayor parte del tiempo en el contexto de OO que proporcionan las extensiones de Objective-C, estamos trabajando con punteros (referencias alias) a estructuras de datos isa (Clases en Objective-C).

Antes del objetivo C 2.0, todos los métodos getter y setter tenían que ser codificados por el desarrollador para cada atributo que para la mayoría de los casos era copiar/pegar código. Para ser completamente compatible con KVC/KVO requiere mucho de código muy tedioso ... willAccessValueForKey, didUpdateValueForKey declaraciones etc. que el nuevo compilador agrega automáticamente cuando usa la sintaxis @ property/@ synthesize. Este es un gran aumento de productividad para los desarrolladores. Las adiciones sintaxis con punto para el lenguaje son un poco más polémico en la comunidad, ya que oculta la magia el compilador está haciendo en usted nombre a interpretar la declaración object.property = anotherObject.property; como [object setProperty:[anotherObject property]];

A partir de la documentación de Apple que se hace referencia en otras respuestas

Declaración de bienes atributos

Se puede decorar una propiedad con atributos mediante el uso de la forma @property (atributo [, atributo2, ...]). Al igual que los métodos, las propiedades tienen un alcance a su declaración de interfaz adjunta. Para las declaraciones de propiedades que utilizan una lista delimitada por comas de nombres de variables, los atributos de propiedad se aplican a todas las propiedades nombradas.

Si usa la directiva @synthesize para indicar al compilador que cree los métodos de acceso, el código que genera coincide con las especificaciones dadas por las palabras clave. Si implementa los métodos de acceso usted mismo, debe asegurarse de que coincidan con la especificación (por ejemplo, si especifica la copia, debe asegurarse de copiar el valor de entrada en el método setter).

3

Espero que esto te ayude.

@property y @synthesize se usa para acceder a objeto o variable en otra clase.

Aquí es un ejemplo pequeño: Esta es la primera clase

#import <UIKit/UIKit.h> 
#import "ClassB.h" 
@interface ViewController : UIViewController 
@property(nonatomic, retain) NSString *FirstName; 
@property(nonatomic, retain) NSString *LastName; 


#import "ViewController.h" 
@interface ViewController() 
@end 
@implementation ViewController 
@synthesize FirstName, LastName; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.FirstName = @"Ashvin"; 
    self.LastName = @"Ajadiya"; 
    ClassB *ClassBOb = [[ClassB alloc] init]; 
    ClassBOb.ViewCntrlrOb = self; 
    [ClassBOb CallMe]; 
} 
@end 

y esta es otra clase:

#import <UIKit/UIKit.h> 
@class ViewController; 
@interface ClassB : UIViewController 
@property(nonatomic, retain) ViewController *ViewCntrlrOb; 
-(void) CallMe; 
@end 

#import "ClassB.h" 
#import "ViewController.h" 
@interface ClassB() 
@end 
@implementation ClassB 
@synthesize ViewCntrlrOb; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

-(void) CallMe 
{ 
    NSLog(@"FirstName = %@",ViewCntrlrOb.FirstName); 
    NSLog(@"LastName = %@",ViewCntrlrOb.LastName); 
} 

para que pueda acceder nombre y apellido en ClassB.

Y Imprimen:

2012-05-25 14: 38: 10.766 myExample [8751: c07] Nombre = Aswin 2012-05-25 14: 38: 10.768 myExample [8751: c07] Apellido = Ajadiya