为什么没有相应的伊娃隐藏超类ivars的子类@property?

以下看起来很简单。 有一个ivar的超类,和一个访问(@保护的)超级ivar的子类:

// 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 

简单而正确 – 看似够了。 但是,尝试编译(对于iOS 4.2 SDK,使用GCC 4.2)会产生指向NSLog行的错误:'testIvar undeclared'。

我是新来的Objective-C,但不能为我的生活看到为什么这应该是一个错误。 注释掉testProperty的东西,它编译好。 好像在一个子类中添加一个综合的属性,没有相应的ivar,实际上是隐藏了一个不相关的超类ivar。

任何人都可以启发我在这里发生了什么? 相关的,编译错误是否可预见? (预见它会救了我一些时间和挫折)。

LLVM编译源代码而不抱怨,切换到LLVM:select目标→获取信息→编译→C / C ++编译器版本→LLVM 1.5。 从我有限的经验来看,无论如何它都是更好的编译器。 不知道为什么GCC的行为方式 – 有趣的捕捉。

testIvar未声明的错误实际上是在这种情况下的红鲱鱼。 这个消息似乎是由testProperty没有相应的伊娃。 要解决此问题,请在TestSubClass.h中声明testProperty ivar或在TestSubClass.m中创buildtestProperty @dynamic。