【问题标题】:Why does a subclass @property with no corresponding ivar hide superclass ivars?为什么没有相应 ivar 的子类 @property 隐藏超类 ivar?
【发布时间】:2010-10-18 07:38:01
【问题描述】:

以下内容似乎很简单。有一个带有 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。

谁能告诉我这里发生了什么?与此相关的是,编译错误是否可以预见? (预见到它会为我节省一些时间和挫败感)。

【问题讨论】:

    标签: objective-c ios ios4


    【解决方案1】:

    LLVM 编译源码无怨无悔,切换到 LLVM:Select target → Get Info → Build → C/C++ Compiler Version → LLVM 1.5。根据我有限的经验,无论如何它是一个更好的编译器。不知道为什么 GCC 会这样做——有趣的问题。

    【讨论】:

    • 谢谢。无论如何,一直想尝试 LLVM,所以现在是时候了。正如您提出的修复建议,我已将其标记为已回答,并且大概只有 GNU 和/或 Apple 开发人员会知道真正的原因。
    • 我遇到了同样的问题。奇怪的。 LLVM ftw
    • 也遇到了同样的问题。没用过LLVM,发现更好
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多