iphone objective-c xcode inheritance scope

iphone - objetivo c xcode 4.0.2: la subclase no puede acceder a las variables de la superclase "no se declaró en este ámbito"



objective-c inheritance (3)

De los documentos: Apple Objective-C Programming Language (ya no menciona esto, pero puede encontrarlo en este documento retirado ) .

Se puede acceder a la variable de instancia dentro de la clase que la declara y dentro de las clases que la heredan. Todas las variables de instancia sin una directiva de alcance explícito tienen @protected scope.

Sin embargo, se puede acceder a una variable de instancia pública en cualquier lugar como si fuera un campo en una estructura C. Por ejemplo:

Worker *ceo = [[Worker alloc] init];

ceo->boss = nil;

Tengo el error de compilación usando LLVM GCC 4.2 (para un proyecto de iOS, en el dispositivo):

error: ''fooInstanceVar'' no declarado (primer uso en esta función) y el mismo usando GCC 4.2: error: ''fooInstanceVar'' no declarado (primer uso en esta función)

Puedo compilar usando LLVM Compiler 2.0 sin error.

Para compilar con LLVM GCC 4.2 y GCC 4.2 con el uso de self-> :

[NSArray arrayWithObjects:self.barProperty, self->fooInstanceVar, nil]; en el método doSomethingWithProperty .

Tengo varias clases que son subclases de una clase Layer. Por alguna razón, una de las subclases actúa de manera diferente. esta es una versión simplificada:

@interface Layer: CCLayer { GameScene* _scene; CCNode* _layerNode; } @end #import "Layer.h" @interface UILayer: Layer { } @end @implementation UILayer -(void) doStuff { [_layerNode addChild:[CCNode node]]; <---gives compile error: "_layerNode was not declared in this scope" [_scene playSound];<------gives compile error: "_scene was not declared in this scope" } @end

Creo que eso atrapa la idea básica. Puedo arreglar esto haciendo

[[_self _layerNode] addChild:[CCNode node]]; [[_self _scene] playSound];

pero lo que no puedo entender es por qué otras subclases de Layer pueden acceder a _layerNode y _scene directamente? Supongo que es un problema con la configuración de compilación. Además, este problema solo ocurre cuando lo construyo para el dispositivo (iphone) y no el simulador. avíseme si necesita más información para responder.

Editar:

Vaya, lo escribí mal. Debería haber sido [[self _layerNode] addNode:[CCNode node]] pero supongo que la pregunta es por qué una subclase tendría acceso directo al ivar _layerNode y otra tendría que acceder con [self _layerNode] . Es como si UILayer no pudiera encontrar el encabezado de superclase


Quizás es el nombre. El prefijo ''UI'' está designado para las clases de UIKit. Bien podría ser que UILayer es una clase privada de UIKit utilizada por Apple.


Si @synthesize ivars, el compilador no puede dejar de acceder "directamente". La solución es relativamente fácil: escriba self->_layerNode y self->_scene .

Supongo que su "versión simplificada" compila bien.

Tenga en cuenta que también es mala forma acceder directamente a los ivars de su superliga a menos que sepa cuáles son los detalles de su implementación.

(¿Qué es _self ?)