采用这个简单的类层次结构:
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
,但这也不起作用。这里有一个简单的概念,但我已经失去了一个小时的搜索,试图找到一个解决方案。在这一点上出于想法。
- 编辑 -
上面的代码只是一个非常精简的例子来展示我所看到的问题。
答案 0 :(得分:1)
我刚试过你的代码,补充了协议,实现它的对象,必要的import
和main
函数,在我的系统上它就像一个魅力:
#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)
我终于能够弄明白了。我的实际代码利用了第三方静态库,它在我的示例中定义了类Tree
和Aspen
。我已经构建了一个新版本的静态库,它暴露了我的示例中给出的Tree delegate
,但是在将它添加到我的项目之后我没有正确地重新链接库,因此旧的版本仍然被访问在运行时。
经验教训:努力学习导入第三方库的步骤,当简单的基础编程概念(例如我的示例文本)不起作用时,退后一步,确保你已经点缀并交叉吨的。