Actualización: muchas personas insisten en que necesito declarar un iVar para la propiedad. Algunos dicen que no, porque estoy usando Modern Runtime (64 bit). Puedo confirmar que he estado usando @property sin iVars con éxito desde hace meses. Por lo tanto, creo que la respuesta 'correcta' es una explicación de por qué en 64 bits de repente tengo que declarar explícitamente el iVar cuando (y solo cuando) voy a acceder a él desde una clase infantil. El único que he visto hasta ahora es un posible error de GCC (gracias Yuji). No es tan simple después de todo ... Para aclarar el posible error es este: Al heredar de una clase base, un niño no puede acceder a la iVar IF del padre que ese mismo niño implementa un acceso no definido usando @synthesize ANTES de que se acceda al iVar.(No tan) Problema de herencia tonto de Objective-C al usar la propiedad - ¿Error de GCC?
He estado rascándome la cabeza con esto por un par de horas - No he usado mucho la herencia.
Aquí he configurado una clase simple Test B que hereda de la Prueba A, donde se declara un ivar. Pero obtengo el error de compilación de que la variable no está declarada. Esto solo ocurre cuando agrego la propiedad y sintetizo las declaraciones, funciona bien sin ellas.
Testa Header:
#import <Cocoa/Cocoa.h>
@interface TestA : NSObject {
NSString *testString;
}
@end
Testa Implementación está vacía:
#import "TestA.h"
@implementation TestA
@end
TestB Header:
#import <Cocoa/Cocoa.h>
#import "TestA.h"
@interface TestB : TestA {
}
@property (nonatomic, retain) NSString *testProp;
@end
TestB Aplicación (Error - 'testString' es no declarado)
#import "TestB.h"
@implementation TestB
@synthesize testProp;
- (void)testing{
NSLog(@"test ivar is %@", testString);
}
@end
Si "solo ocurre cuando [usted] agrega la propiedad y sintetiza las declaraciones", no son una arenga roja. Como mencioné, en realidad están causando el problema porque no hay una variable de instancia de cadena 'testProp'. Declaré uno y el problema desapareció. –
Acabo de verificar para asegurarme de que no estaba yendo mentalmente, y uso @property sin un ivar todo el tiempo sin ningún problema. Estoy de acuerdo en que declarar una 'ivar' la soluciona ', pero realmente no explica por qué solo no se puede compilar cuando utilizo la herencia. Solo para volver a iterar, no estoy declarando ivars para aproximadamente 50 propiedades solo dentro del mismo proyecto, en muchas clases diferentes, todas sin problema. –