Pregunta

Estoy modificando QuartzDemo ejemplo aplicación y quiero hacer set y leer los valores de las variables de tipo entero en otras clases que ya están incluidos.

Por ejemplo, en MainViewController.m quiero fijar un valor numérico (números simples de 1-100) a una variable que luego se va a llamar (lectura) en QuartzImages.m archivo.

La pregunta es cómo definir variables correctamente, ajuste y acceso (lectura) el valor.

Soy un principiante con Obj C y iPhone SDK en general y tener alguna experiencia con Delphi y VB pero esto no ayuda para nada:)

Gracias, quienquiera y dondequiera que se encuentre, persona que me va a sacar de este bucle sin fin googlear.

¿Fue útil?

Solución

Si usted tiene una variable, hay dos maneras de leer y establecer las propiedades (que son por lo general una combinación de un Ivar y métodos de acceso). La antigua forma (todavía preferida por algunos) es utilizar directamente los métodos de acceso:

//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]

La nueva forma es utilizar dot-sintaxis (que sólo funciona para las propiedades, y no se puede utilizar con métodos más complicados):

int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]

Si se trata de usted confuso, me altamente recomiendo recoger una copia de Aaron libro de Hillegass. En él se explica Cocoa y Objective-C en gran detalle.

EDIT: Creo que parte de la confusión aquí es con la terminología. En Objective-C, la mayoría de los objetos tienen las variables de instancia (Ivars), que en realidad almacenan datos. Sin embargo, en general se quiere evitar el acceso directo a Ivars, especialmente de otros objetos. (Este es un principio de diseño orientado a objetos, y no es realmente específico para Objective-C.)

La razón principal de esto es para aumentar la flexibilidad - si tengo un Person clase que tiene una variable age ejemplo, por ejemplo, es posible que quiera cambiar de aplicación en el futuro para determinar dinámicamente la edad. Si otras clases se basan en la variable de instancia age, se romperán cuando la aplicación cambia.

La forma de evitar este problema es de acceso de uso, que son métodos que controlan el acceso a una Ivar. En Objective-C, "captadores" consiguen la variable, y por lo general se nombran lo mismo que la variable (por lo que en el ejemplo Person, el comprador sería -(int)age) y "set" establecer la variable (que se llamaría -(void)setAge:(int)theAge). Si utiliza descriptores de acceso, puede cambiar libremente su aplicación en el futuro, incluso para deshacerse de la Ivar por completo si es necesario, sin clases que dependen de romper.

En Objective-C, la combinación de un Ivar y descriptores de acceso es a menudo llamado "propiedad" (aunque no hace necesaria tiene que ser una Ivar, si se crea dinámicamente el valor). Si se piensa en términos de propiedades, usted no tiene que preocuparse de Ivars en otras clases - -son los detalles de implementación. Objective-C 2.0 tiene un poco de azúcar sintáctica agradable para crear propiedades:

//Person.h
@interface Person : NSObject {
    int age;
}

@property (assign) int age;  //declares the accessors

@end

//Person.m
@implementation Person

@synthesize age; //implements -(int)age and -(void)setAge:theAge

@end

Lo importante para recordar es la mayor parte del tiempo, usted debe pensar en términos de propiedades en lugar de Ivars. Nunca se debe acceder directamente Ivars en otras clases. Usted debe rara vez (o nunca) Ivars de acceso en superclases. Si usted es un purista, no debe incluso Ivars directamente de acceso en la misma clase, excepto en descriptores de acceso, init y dealloc (y los dos últimos son objeto de debate).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top