継承された@propertyは @propertyを満たしていませんか?
-
18-09-2020 - |
質問
プロトコルを持っています:
@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];
}
.
しかし、私がサポートされていない何かをしているかどうかを知りたいのですが、私がしてはいけないこと、またはそれがコンパイラの限界/バグの場合は?
解決
プロパティを@dynamicとして宣言することで、コンパイラにプロパティgetter(および必要な場合は設定)が他の場所で実装されていることをコンパイラに伝えます(潜在的に実行時に)。これは私に完全に合理的なユースケースのように聞こえます。
他のヒント
私はこの正確な問題にも渡ってきました。これは@秘密がある状況の1つです。
これは、Objective-C:
での変数、プロパティ、およびSyntheSizeのルールです。プロパティがある場合は、@dyntheizeを持つ必要があります。@dynamicを宣言して、ゲッターとセッターメソッドを自分で書きます。
だから、ビューというプロパティがあるため、@syntheizeを宣言する必要があります。それはそれであるべきです。@protocol、継承
とは関係ありません所属していません StackOverflow