objective-c - 继承的@property 不能满足 <protocol> @property 吗?

标签 objective-c cocoa oop cocoa-design-patterns

我有一个协议(protocol):

@protocol Gadget <NSObject>

@property (readonly) UIView *view;

- (void) attachViewToParent:(UIView *)parentView;

@end

还有一个“抽象”基类,带有 -(UIView *)view 的实现(作为 getter,未显示):

// Base functionality
@interface AbstractGadget : NSObject {
    UIView *view;
}

@property (readonly) UIView *view;

@end

但是当我在 AbstractGadget 的子类中实现 Gadget 协议(protocol)时,如下所示:

// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}

- (void) attachViewToParent:(UIView *)parentView;

@end


@implementation BlueGadget

- (void) attachViewToParent:(UIView *)parentView {
    //...
}

@end

我收到一个编译器错误,告诉我“警告:属性‘view’需要定义方法‘-view’。”我可以使用 @dynamic 或添加一个 stub 方法来解决这个问题:

- (UIView *) view {
    return [super view];
}

但我只想知道我是否正在做不受支持的事情、我不应该做的事情,或者这是否只是编译器中的限制/错误?

最佳答案

通过将属性声明为@dynamic,您是在告诉编译器属性getter(和setter,如果需要的话)是在别处(可能在运行时)实现的。对我来说,这听起来像是一个非常合理的用例。

参见 The Docs想要查询更多的信息。

关于objective-c - 继承的@property 不能满足 <protocol> @property 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3295782/

相关文章:

ios - iOS/Objective-C 中的 TCP 客户端 - 检查开放端口

objective-c - 在 UIViewController 中接收 UITableViewCell 的 TouchesBegan

objective-c - 没有子类化的事件处理

java引用不在范围内的对象

ios - 设置TableViewHeader时,section header文本被移除

ios - 使用头部或尾部来选择将生成的 Sprite 之间的位置,并选择 Sprite 移动的速度

c++ - 依赖于尚未构造的对象的构造函数

javascript - 访问异步模块内部类的方法或

cocoa - 将 NSTimer 放置在单独的线程中

cocoa - 以编程方式关闭 NSPreferencePane 或检测它何时再次加载