Objective c 目标C-Can';在子类中设置超类属性

Objective c 目标C-Can';在子类中设置超类属性,objective-c,inheritance,properties,Objective C,Inheritance,Properties,以这个简单的类层次结构为例: Tree.h: @interface Tree : NSObject @property (nonatomic, assign) id<TreeDelegate> delegate; @end @implementation Tree @synthesize delegate; @end @interface Aspen : Tree - (void)grow:(id<TreeDelegate>)delegate; @end @impl

以这个简单的类层次结构为例:

Tree.h

@interface Tree : NSObject
@property (nonatomic, assign) id<TreeDelegate> delegate;
@end
@implementation Tree
@synthesize delegate;
@end
@interface Aspen : Tree
- (void)grow:(id<TreeDelegate>)delegate;
@end
@implementation Aspen
- (void) grow:(id<TreeDelegate>)d {
    self.delegate = d;
}
@end
Aspen.h

@interface Tree : NSObject
@property (nonatomic, assign) id<TreeDelegate> delegate;
@end
@implementation Tree
@synthesize delegate;
@end
@interface Aspen : Tree
- (void)grow:(id<TreeDelegate>)delegate;
@end
@implementation Aspen
- (void) grow:(id<TreeDelegate>)d {
    self.delegate = d;
}
@end
@interface Aspen:Tree
-(void)grow:(id)委托;
@结束
Aspen.m

@interface Tree : NSObject
@property (nonatomic, assign) id<TreeDelegate> delegate;
@end
@implementation Tree
@synthesize delegate;
@end
@interface Aspen : Tree
- (void)grow:(id<TreeDelegate>)delegate;
@end
@implementation Aspen
- (void) grow:(id<TreeDelegate>)d {
    self.delegate = d;
}
@end
@实现Aspen
-(void)grow:(id)d{
self.delegate=d;
}
@结束
当我尝试执行
self.delegate=d,我收到以下错误:

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

我原以为父类的
委托
属性对子类是可见的,但它似乎不可见,因为错误表明父类的合成setter不可见

我错过了什么?我必须在子类级别重新声明属性吗?我尝试在Aspen的
实现顶部添加
@dynamic
,但也没有成功。这是一个很简单的概念,但我花了一个小时到处寻找解决方案。在这一点上,我们没有想法

--编辑--


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

我刚刚尝试了您的代码,并辅以协议、实现它的对象、必要的
导入
函数,在我的系统上,它就像一个符咒:

#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;
}
#导入
@协议树LEGATE
@结束
@接口MyDelegate:NSObject
@结束
@实现MyDelegate
@结束
@接口树:NSObject
@属性(非原子,赋值)id委托;
@结束
@接口Aspen:Tree
-(void)grow:(id)委托;
@结束
@实现树
@综合代表;
@结束
@Aspen的实现
-(void)grow:(id)d{
self.delegate=d;
}
@结束
int main(int argc,字符**argv){
MyDelegate*d=[[MyDelegate alloc]init];
Aspen*a=[[Aspen alloc]init];
[a:d];
返回0;
}

我终于找到了答案。我的实际代码利用了第三方静态库,该库定义了我的示例中的类
Tree
Aspen
。我已经构建了一个新版本的静态库,它公开了我的示例中给出的
树委托
,但是在将库添加到我的项目中之后,我没有正确地重新链接库,因此在运行时仍然可以访问旧版本


经验教训:认真执行导入第三方库的步骤,当简单的基本编程概念(如我的示例文本)不起作用时,请后退一步,确保您已将i和t标记为虚线。

我认为我们需要实际的代码-在修复Aspen的
实现
打字错误之后,这对我来说很好。@Tim拼写错误修复,谢谢。所以-这应该可以按原样工作吗?我不能发布实际的代码,但我已经更新了问题中的示例,以便更准确地反映实际的源代码。@Madbreaks:我觉得你的精简版本不错。这个问题肯定会在你删除代码时发现。@KevinBallard等人,谢谢。我会再看看我有什么,并尝试发布更多。哇,好的。这至少证实了我之前的想法,即它应该以这种方式工作。我将再看一眼我的代码,看看我是否能发现与这里的代码有什么不同。