2010-10-18 41 views
12

以下看起来很简单。有与伊娃超类和子类,可以访问(@protected)超伊娃:为什么没有相应的ivar hide superclass ivars的子类@property?

// 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的东西,并编译好。看起来像在一个子类中添加一个综合属性,没有相应的伊娃,实际上是隐藏了一个不相关的超级伊娃。

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

回答

7

LLVM编译没有投诉源,切换到LLVM:选择目标→获取信息→构建→C/C++编译器版本→LLVM 1.5。从我有限的经验来看,它无论如何都是更好的编译器。不知道为什么GCC的行为方式 - 有趣的捕捉。

+0

谢谢。无论如何,一直有意要尝试LLVM,所以这里就是这个场合。我已经标记了你提出的修复建议,大概只有GNU和/或Apple开发人员会知道真实原因。 – Cris 2010-10-18 20:52:16

+0

我遇到了同样的问题。奇怪的。 LLVM ftw – logancautrell 2011-02-25 16:33:29

+0

也出现同样的问题。从未使用LLVM,发现它更好 – edo42 2011-08-11 16:01:14

1

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

相关问题