2010-10-18 13 views
12

Das folgende scheint einfach genug. Es gibt eine übergeordnete Klasse mit einem Ivar, und eine Unterklasse, die greift die (@protected) Super Ivar:Warum versteckt eine Unterklasse @property ohne entsprechende ivor superclass 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 

Einfach und korrekt wirkenden genug. Der Versuch, zu kompilieren (für iOS 4.2 SDK mit GCC 4.2), erzeugt jedoch diesen Fehler, der auf die NSLog-Zeile verweist: "testIvar undeclared".

Ich bin neu in Objective-C, aber kann nicht für das Leben von mir sehen, warum dies ein Fehler sein sollte. Kommentieren Sie testProperty und geben Sie OK ein. Es scheint, als würde das Hinzufügen einer synthetisierten Eigenschaft in einer Unterklasse ohne einen entsprechenden Ivar tatsächlich eine nicht verwandte Oberklasse-Ivar verbergen.

Kann mir jemand aufklären, was hier passiert? In Zusammenhang damit war der Kompilierungsfehler vorhersehbar? (Voraussichtlich hätte es mir einige Zeit und Frustration erspart).

Antwort

7

LLVM kompiliert die Quelle ohne Beschwerden, wechseln Sie zu LLVM: Wählen Sie Ziel → Get Info → Erstellen → C/C++ Compiler Version → LLVM 1.5. Aus meiner begrenzten Erfahrung ist es sowieso ein besserer Compiler. Keine Ahnung, warum der GCC sich so verhält - interessanter Fang.

+0

Danke. Hatte Sinn, LLVM sowieso zu versuchen, also hier ist der Anlass. Ich habe die Antwort "markiert", da Sie eine Fehlerbehebung vorgeschlagen haben. Vermutlich werden nur die GNU- und/oder Apple-Entwickler die wahre Ursache kennen. – Cris

+0

Ich stieß auf das gleiche Problem. Seltsam. LLVM ftw – logancautrell

+0

Ran in das gleiche Problem auch. Habe LLVM nie benutzt und festgestellt, dass es besser ist – edo42

1

Der Fehler "nicht erkannter TestIvar" ist in diesem Fall tatsächlich "redhering". Diese Nachricht scheint dadurch zu entstehen, dass testProperty keinen entsprechenden ivar hat. Um das Problem zu lösen, deklarieren Sie entweder testProperty ivar in TestSubClass.h oder testProperty @dynamic in TestSubClass.m.

Verwandte Themen