2010-02-02 8 views

Respuesta

57

Objective-C, como un superconjunto de C, definitivamente permite el acceso de variables de instancia públicas desde fuera de la implementación de la clase. Ahora, la razón por la que puede haber escuchado que no está permitido es que es altamente desaconsejable. En la mayoría de los casos, si desea acceder a una variable de instancia fuera de un contexto de implementación, debe usar accesores y mutadores (propiedades).

Una clase Objective-C realmente se reduce a una estructura C simple con un campo isa (eso es lo que lo convierte en un objeto), donde los campos públicos son accesibles. Dado que cuando se trata de instancias de clases, estamos trabajando con un puntero a un objeto (estructura especial). Por lo tanto, accedemos a los campos públicos usando ->.

He aquí un ejemplo:

@interface SomebodyIsntEncapsulating : NSBadIdea { 
    @public 
    NSString *badIdea; 
    BOOL shouldntDoIt; 

    @protected 
    NSString *ahThatsBetterThankGod; 

    @private 
    NSString *sweetThanksNowEvenMySubclassesCantTouchMe; 
} 

Ahora, en un contexto completamente diferente, podríamos tener:

SomebodyIsntEncapsulating *whatOh = [[SomebodyIsntEncapsulating alloc] 
             initWithDanger:kDangerLevelEpicBraceYourself]; 
whatOh->badIdea = [@"I'm a public field. Make sure to retain or copy me!" copy]; 
NSLog(@"Please! Write some accessors and mutators!: %@", whatOh->badIdea); 

espero que ayudó!

+1

Gracias por una respuesta detallada. ¡Esto es justo lo que quiero saber! – Eonil

+10

Jaja que hizo mi mañana. Buena respuesta – Chris

6

Puede acceder a él como el uso de -> (miembro de puntero) del operador como lo hace normalmente acceso de los miembros de una estructura de c (tenga en cuenta que siempre tiene un puntero a un objeto en obj-c):

... 
@public 
int a; 
... 

myObject->a = 1; 
2

Se supone que debe escribir métodos de acceso para hacerlo. El diseño orientado a objetos implica que una clase no debería preocuparse por la estructura interna de los objetos de otra clase.

Dicho esto, id es solo un puntero, por lo que puede hacer obj-> ivar, siempre que sepa lo que está haciendo y no hay forma de escribir un método de acceso adecuado.

Cuestiones relacionadas