iphone - ¿Cuál es el punto de @property y @synthesize?
ios4 objective-c-2.0 (4)
No he podido averiguarlo, y no hay sitios web que lo expliquen con claridad ... ¿cuáles son exactamente los propósitos de @property
y @synthesize
?
¡Gracias por adelantado!
El compilador interpreta el símbolo "@" 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 OO que proporcionan las extensiones de Objective-C, estamos trabajando con punteros (también conocidas como referencias) para isa data structures (Clases en Objective-C).
Antes de Objective-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 se requiere un 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 de sintaxis de punto al lenguaje son un poco más polémicas en la comunidad ya que esto oculta la magia que el compilador está haciendo en su nombre para interpretar el object.property = anotherObject.property;
declaración como [object setProperty:[anotherObject property]];
De la documentación de Apple a la que se hace referencia en otras respuestas
Atributos de declaración de propiedad
Puede decorar una propiedad con atributos utilizando el formulario @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 decirle 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).
Solo un ejemplo rápido de por qué es posible que no desee hacer solo "variable = 0":
Digamos que tiene esta propiedad:
@property (nonatomic, retain) id <MyDelegate> theDelegate;
Siempre que reemplace a ese delegado con uno nuevo, sus instaladores y ejecutores sintetizados manejarán el lanzamiento / retención para usted cada vez que lo configure de la siguiente manera:
self.theDelegate = newObject;
Realmente lo que sucedió fue esto:
[self setTheDelegate:newObject];
- (void)setTheDelegate:(id <MyDelegate>)anObject {
[theDelegate release];
theDelegate = [anObject retain];
}
(Esto se simplifica por supuesto)
Puede hacer cosas muy potentes en sus propios setters y getters, sintetizar es para aquellos que ocurren una y otra vez como propiedades retenidas, etc. Al compilar, mira su @property y construye los métodos en consecuencia.
Guía de programación de tiempo de ejecución de Objective-C: Propiedades declaradas
@property
declara los métodos getter y 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 la implementación predeterminada para estos dos @synthesize
.
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 para los clientes de su clase, pero se lee y escribe mediante 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
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.
Espero que esto ayude.
@property y @synthesize se usan para acceder a objeto o variable en otra clase.
Aquí hay un pequeño ejemplo: esto es de 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);
}
Entonces puede acceder a FirstName y LastName en ClassB.
Y ellos imprimen:
2012-05-25 14: 38: 10.766 MyExample [8751: c07] FirstName = Ashvin 2012-05-25 14: 38: 10.768 MyExample [8751: c07] LastName = Ajadiya