2010-10-18 5 views
12

Lo siguiente parece bastante simple. Hay una superclase con un Ivar, y una subclase que accede a la (@protected) superclases Ivar:¿Por qué una subclase @property sin ivar correspondiente ivar oculta superclases ivars?

// Testclass.h  
@interface TestClass : NSObject { 
    NSString *testIvar; 
} 
@end 

//TestClass.m 
@implementation TestClass 
@end 

//TestSubclass.h 
@interface TestSubClass : TestClass { 
} 

@property (nonatomic, retain) NSString *testProperty; 
- (void) testMethod; 

@end 

//TestSubclass.m  
#import "TestSubClass.h" 
@implementation TestSubClass 

@synthesize testProperty; 

- (void) testMethod{ 
    NSLog(@"The value was: %@", testIvar); 
} 
@end 

suficientemente simple y de apariencia correcta. Sin embargo, intentar compilar (para iOS 4.2 SDK, con GCC 4.2) produce este error apuntando a la línea NSLog: 'testIvar no declarado'.

Soy nuevo en Objective-C, pero no puedo ver por qué esto debería ser un error. Comente las cosas de testProperty y compila OK. Parece que agregar una propiedad sintetizada en una subclase, sin un ivar correspondiente, en realidad está ocultando una superclase no relacionada ivar.

¿Alguien me puede aclarar qué está pasando aquí? Relacionado, ¿era el error de compilación previsible? (Previendo que me hubiera ahorrado algo de tiempo y frustración).

Respuesta

7

LLVM compila la fuente sin quejas, cambie a LLVM: Seleccione el objetivo → Obtener información → Compilación → Versión del compilador C/C++ → LLVM 1.5. Desde mi experiencia limitada, es un compilador mejor de todos modos. No tengo idea de por qué GCC se comporta de la manera en que lo hace: captura interesante.

+0

Gracias. Había tenido la intención de probar LLVM de todos modos, así que aquí está la ocasión. He marcado la respuesta porque sugirió una solución y, presumiblemente, solo los desarrolladores de GNU y/o Apple conocerán la verdadera causa. – Cris

+0

Me encontré con el mismo problema. Extraño. LLVM ftw – logancautrell

+0

Se metió en el mismo problema también. Nunca usó LLVM y descubrió que es mejor – edo42

1

El error testIvar no declarado es en realidad el arenque rojo en este caso. Este mensaje parece ser causado por testProperty que no tiene un ivar correspondiente. Para resolver el problema, declare un testProperty ivar en TestSubClass.h o haga testProperty @dynamic en TestSubClass.m.

Cuestiones relacionadas