Objective C - 无法在子类中设置超类属性

时间:2013-01-18 23:52:26

标签: objective-c inheritance properties

采用这个简单的类层次结构:

tree.h中

@interface Tree : NSObject
@property (nonatomic, assign) id<TreeDelegate> delegate;
@end

Tree.m

@implementation Tree
@synthesize delegate;
@end

Aspen.h

@interface Aspen : Tree
- (void)grow:(id<TreeDelegate>)delegate;
@end

Aspen.m

@implementation Aspen
- (void) grow:(id<TreeDelegate>)d {
    self.delegate = d;
}
@end

当我尝试self.delegate = d;时,我收到以下错误:

  

- [Aspen setDelegate:]:无法识别的选择器发送到实例0x586da00

我希望Tree父类的delegate属性对于子类是可见的,但它似乎不是因为错误表明父类的合成setter不是可见。

我错过了什么?我是否必须在子类级别重新声明属性?我尝试在@dynamic的实现顶部添加Aspen,但这也不起作用。这里有一个简单的概念,但我已经失去了一个小时的搜索,试图找到一个解决方案。在这一点上出于想法。

- 编辑 -

上面的代码只是一个非常精简的例子来展示我所看到的问题。

2 个答案:

答案 0 :(得分:1)

我刚试过你的代码,补充了协议,实现它的对象,必要的importmain函数,在我的系统上它就像一个魅力:

#import <Foundation/Foundation.h>

@protocol TreeDelegate <NSObject>
@end

@interface MyDelegate : NSObject <TreeDelegate>
@end

@implementation MyDelegate
@end

@interface Tree : NSObject
@property (nonatomic, assign) id<TreeDelegate> delegate;
@end

@interface Aspen : Tree
- (void)grow:(id<TreeDelegate>)delegate;
@end

@implementation Tree
@synthesize delegate;
@end

@implementation Aspen
- (void) grow:(id<TreeDelegate>)d {
    self.delegate = d;
}
@end

int main(int argc, char ** argv) {
    MyDelegate * d = [[MyDelegate alloc] init];
    Aspen * a = [[Aspen alloc] init];

    [a grow:d];
    return 0;
}

答案 1 :(得分:0)

我终于能够弄明白了。我的实际代码利用了第三方静态库,它在我的示例中定义了类TreeAspen。我已经构建了一个新版本的静态库,它暴露了我的示例中给出的Tree delegate,但是在将它添加到我的项目之后我没有正确地重新链接库,因此旧的版本仍然被访问在运行时。

经验教训:努力学习导入第三方库的步骤,当简单的基础编程概念(例如我的示例文本)不起作用时,退后一步,确保你已经点缀并交叉吨的。