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 が存在する状況の 1 つです。

于 2010-07-21T09:31:04.183 に答える
0

Objective-C での変数、プロパティ、合成のルールは次のとおりです。

プロパティがある場合は、@synthesize を指定するか、@dynamic を宣言して getter メソッドと setter メソッドを自分で作成する必要があります。

ビューというプロパティがあるので、@synthesize を宣言する必要があります。それだけです。@protocol、継承とは関係ありません

于 2010-07-21T02:09:42.770 に答える