2010-10-18 10 views
12

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).

risposta

7

LLVM compila la sorgente senza reclami, passa a LLVM: Seleziona destinazione → Ottieni informazioni → Build → Versione compilatore C/C++ → LLVM 1.5. Dalla mia esperienza limitata è comunque un compilatore migliore. Non ho idea del perché GCC si comporti come fa, cattura interessante.

+0

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

+0

Mi sono imbattuto nello stesso problema. Strano. LLVM ftw – logancautrell

+0

Anche nello stesso problema. Non ho mai usato LLVM e ho scoperto che è meglio – edo42

1

In questo caso, l'errore non dichiarato di testIvar è in realtà un errore. Questo messaggio sembra essere causato da testProperty che non ha un ivar corrispondente. Per risolvere il problema, dichiarare un testProperty ivar in TestSubClass.h oppure effettuare testProperty @dynamic in TestSubClass.m.

Problemi correlati