質問

プロトコルを持っています:

@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、継承

とは関係ありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top