0

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

树.h

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

树.m

@implementation Tree
@synthesize delegate;
@end

阿斯彭.h

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

阿斯彭.m

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

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

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

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

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

- 编辑 -

上面的代码只是一个非常精简的示例,用于演示我所看到的问题。

4

2 回答 2

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;
}
于 2013-01-19T00:24:04.347 回答
0

我终于能够弄清楚这一点。在我的示例中,我的实际代码利用了定义类的第 3 方静态库TreeAspen我已经构建了一个新版本的静态库,该版本公开了Tree delegate我的示例中给定的内容,但是在将它添加到我的项目后我没有正确重新链接该库,因此旧版本仍在运行时被访问。

经验教训:认真执行导入 3rd 方库的步骤,当简单的基本编程概念(例如我的示例文本)不起作用时,退后一步,确保你已经点了 i 和交叉 t。

于 2013-01-22T17:39:01.210 回答