我有一个协议:
@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
但是当我在Gadget
的子类中实现AbstractGadget
协议时,就像这样:
// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}
- (void) attachViewToParent:(UIView *)parentView;
@end
@implementation BlueGadget
- (void) attachViewToParent:(UIView *)parentView {
//...
}
@end
我收到编译错误告诉我“警告:属性'视图'需要定义方法'-view'。”我可以使用@dynamic
或添加存根方法使其消失:
- (UIView *) view {
return [super view];
}
但我只是想知道我是在做一些不支持的事情,我不应该做的事情,或者它是否只是编译器中的限制/错误?
答案 0 :(得分:5)
通过将属性声明为@dynamic,您告诉编译器属性getter(如果需要,则为setter)在其他地方实现(可能在运行时)。这听起来像是一个非常合理的用例。
有关详细信息,请参阅The Docs。
答案 1 :(得分:2)
我也遇到过这个问题。这是@dynamic所针对的情况之一。
答案 2 :(得分:0)
以下是objective-C中变量,属性和合成的规则:
如果你有一个属性,你必须有一个@synthesize或你声明@dynamic并自己编写getter和setter方法。
因此,因为你有一个名为view的属性,你必须声明@synthesize。那应该是它。与@protocol,继承无关