Objective c 为什么没有相应ivar的subclass@属性隐藏超类ivar?

Objective c 为什么没有相应ivar的subclass@属性隐藏超类ivar?,objective-c,ios,ios4,Objective C,Ios,Ios4,以下内容似乎很简单。有一个带ivar的超类,还有一个子类访问(@protected)超类ivar: // Testclass.h @interface TestClass : NSObject { NSString *testIvar; } @end //TestClass.m @implementation TestClass @end //TestSubclass.h @interface TestSubClass : TestClass { } @property (

以下内容似乎很简单。有一个带ivar的超类,还有一个子类访问(@protected)超类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 target→ 获取信息→ 建造→ C/C++编译器版本→ LLVM 1.5。从我有限的经验来看,无论如何它是一个更好的编译器。不知道GCC为什么会这样做——有趣的捕获。

在本例中,testIvar未声明的错误实际上是转移注意力的。此消息似乎是由testProperty没有相应的ivar引起的。要解决此问题,请在TestSubClass.h中声明testProperty ivar,或在TestSubClass.m中使testProperty@dynamic。

谢谢。无论如何,我一直想尝试LLVM,现在是时候了。我已经将回答标记为您建议的修复,大概只有GNU和/或Apple开发人员知道真正的原因。我遇到了相同的问题。奇怪的LLVM ftwRan也陷入了同样的问题。从未使用过LLVM,并发现它更好