Pourquoi une sous-class @property sans ivar hide superclass ivars?

Ce qui suit semble assez simple. Il y a une superclass avec un ivar, et une sous-class qui accède aux superclasss (@protected) ivar:

// Testclass.h @interface TestClass : NSObject { NSSsortingng *testIvar; } @end //TestClass.m @implementation TestClass @end //TestSubclass.h @interface TestSubClass : TestClass { } @property (nonatomic, retain) NSSsortingng *testProperty; - (void) testMethod; @end //TestSubclass.m #import "TestSubClass.h" @implementation TestSubClass @synthesize testProperty; - (void) testMethod{ NSLog(@"The value was: %@", testIvar); } @end 

Assez simple et correct. Cependant, tenter de comstackr (pour iOS 4.2 SDK, avec GCC 4.2) produit cette erreur pointant vers la ligne NSLog: 'testIvar undeclared'.

Je suis nouveau à Objective-C, mais ne peux pas pour la vie de moi voir pourquoi cela devrait être une erreur. Commentez le testProperty, et il comstack OK. Il semble que l'ajout d'une propriété synthétisée dans une sous-class, sans un ivar correspondant, cache en fait une superclass ivar non apparentée.

Quelqu'un peut-il m'éclairer sur ce qui se passe ici? Dans le même ordre d'idées, l'erreur de compilation était-elle prévisible? (Prévoir cela m'aurait fait gagner du time et de la frustration).

LLVM comstack la source sans se plaindre, passez à LLVM: Sélectionnez la cible → Obtenir les infos → Construire → Version du compilateur C / C ++ → LLVM 1.5. De mon expérience limitée c'est un meilleur compilateur de toute façon. Je ne sais pas pourquoi GCC se comporte comme il le fait – pêche intéressante.

L'erreur non déclarée testIvar est en fait un casse-tête dans ce cas. Ce message semble provenir de testProperty n'ayant pas d'ivar correspondant. Pour résoudre ce problème, déclarez un object testProperty ivar dans TestSubClass.h ou effectuez testProperty @dynamic dans TestSubClass.m.