Quanto segue sembra abbastanza semplice. C'è una superclasse con un Ivar, e una sottoclasse che accede al (@protected) superclassi Ivar:Perché una sottoclasse @property con nessun ivar corrispondente nasconde i superclasse 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
semplice e corretta apparentemente abbastanza. Tuttavia, il tentativo di compilare (per iOS 4.2 SDK, con GCC 4.2) produce questo errore che punta alla riga NSLog: 'testIvar undeclared'.
Sono nuovo di Objective-C, ma non posso per la vita di me vedere perché questo dovrebbe essere un errore. Commentare le cose testProperty e compila OK. Sembra che aggiungere una proprietà sintetizzata in una sottoclasse, senza un ivar corrispondente, sia in realtà nascondendo un ivar superclasse non correlato.
Qualcuno può illuminarmi su cosa sta succedendo qui? In correlazione, l'errore di compilazione era prevedibile? (Prevedendo mi avrebbe risparmiato un po 'di tempo e frustrazione).
Grazie. Avevo intenzione di provare LLVM comunque, quindi ecco l'occasione. Ho contrassegnato la risposta come suggerito una correzione e presumibilmente solo gli sviluppatori GNU e/o Apple conosceranno la vera causa. – Cris
Mi sono imbattuto nello stesso problema. Strano. LLVM ftw – logancautrell
Anche nello stesso problema. Non ho mai usato LLVM e ho scoperto che è meglio – edo42