Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 继承的@属性能否不满足<;协议>@财产?_Objective C_Cocoa_Oop_Cocoa Design Patterns - Fatal编程技术网

Objective c 继承的@属性能否不满足<;协议>@财产?

Objective c 继承的@属性能否不满足<;协议>@财产?,objective-c,cocoa,oop,cocoa-design-patterns,Objective C,Cocoa,Oop,Cocoa Design Patterns,我有一个协议: @protocol Gadget <NSObject> @property (readonly) UIView *view; - (void) attachViewToParent:(UIView *)parentView; @end 但是当我在AbstractGadget的子类中实现Gadget协议时,如下所示: // Concrete @interface BlueGadget : AbstractGadget <Gadget> { } -

我有一个协议:

@protocol Gadget <NSObject>

@property (readonly) UIView *view;

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

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

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

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

@end


@implementation BlueGadget

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

@end

但我只是想知道我是在做不受支持的事情,还是不应该做的事情,或者只是编译器中的一个限制/缺陷?

以下是objective-C中变量、属性和合成的规则:

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


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

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


有关更多信息,请参阅

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

对不起,我应该说得更具体些。在AbstractGadget中有一个“-(UIView*)视图”的完整实现。你能给我看看你在AbstractGadget实现中的代码吗。现在出现了一些问题,因为它通常适用于Messince,因为该属性是在子类中使用@dynamic的基类中实现的。+1与我的答案相同,但更好,并带有指向文档的链接。我必须使用Clang和Xcode 4来测试这一点,当我能够得到它们时。
// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}

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

@end


@implementation BlueGadget

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

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