4

我有一个协议:

@protocol Gadget <NSObject>

@property (readonly) UIView *view;

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

@end

还有一个“抽象”基类,具有以下实现(作为吸气剂,未显示)-(UIView *)view

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

@property (readonly) UIView *view;

@end

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

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

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

@end


@implementation BlueGadget

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

@end

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

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

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

4

3 回答 3

5

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

有关更多信息,请参阅文档

于 2010-07-21T02:25:02.457 回答
2

我也遇到了这个确切的问题。这是@dynamic 适用的情况之一。

于 2010-07-21T09:31:04.183 回答
0

这是objective-C中变量、属性和综合的规则:

如果你有一个属性,你必须有一个@synthesize 或者你声明@dynamic 并自己编写getter 和setter 方法。

因此,因为您有一个名为 view 的属性,所以您必须声明 @synthesize。应该是这样的。与@protocol 无关,继承

于 2010-07-21T02:09:42.770 回答