2

私にはクラスがあり、このクラスにはデリゲートプロトコルがあります。このクラスを使用してメインクラスにオブジェクトを作成し、メインクラスをデリゲートとして割り当てました。メインクラスには、作成したクラス内で読みたいプロパティがあります。それから私はこれをします:

BOOL prop = [self.delegate myProperty];

Xcodeは「delegate応答しない可能性がある」と文句を言いますmyProperty

self.delegate読むためにメッセージmyPropertyを送信していて、キャストされていないオブジェクトにメッセージを送信してもXcodeが文句を言わない場合、なぜそれをしなければならないのですか?

BOOL prop = [(myMainClass *)self.delegate myProperty];

それを機能させるには?

より明確にするために、キャストせずにオブジェクトに送信されるメッセージの例を次に示します。

[self.myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){

    int Number = [[obj dictionaryOfNames] count];

}];

self.myArrayディクショナリであり、このプロパティを持つ別のクラスのオブジェクトの配列ですdictionaryOfNames。Xcodeは私にこれをキャストするように頼んだことはありません:

int Number = [[(myOtherClass *)obj dictionaryOfNames] count];

私が上でしなければならなかったようにmyProperty

4

2 に答える 2

5

さまざまなクラスがプロトコルに準拠できます。プロトコルに準拠していることを宣言する場合は、必要なメソッドを実装すると言うだけですが、、、、などで実装できますUIViewUIViewControllerMyOwnClassMyOtherClass

そのため、プロパティは通常このように宣言されます

@property (nonatomic, weak) id <MyProtocol> delegate;

つまり、デリゲートはプロトコルに準拠するオブジェクトであると言うだけです。

于 2012-06-26T20:03:01.737 に答える
0

完全に明確な答えを出すのに十分なコードを示していませんが、一般的に言えば、デリゲートの定義はidだけではなく、おそらくNSObject*などを使用していると思います。

コンパイラは、ソースコードの「静的」分析を実行し、「self.delegate」で指定されたオブジェクトがそのメソッドを実装するかどうかを判断しようとしています。データ型がたとえばNSObject*の場合、コンパイラはその特定のクラス定義を調べて、メソッドが存在するかどうかを確認します。そうでない場合は、警告が表示されます。

メッセージ受信者のデータ型がidの場合、コンパイラーはあきらめて「まあ、それは何でもかまいませんので、これでうまくいくと思います」と言う傾向があります。

式[objdictionaryOfNames]の結果はおそらくNSDictionary型であり、コンパイラーはその特定のクラスcountメソッドに応答することを確認できます。

プロパティにクラス名を指定した場合にもこの問題が発生する可能性がありますが、コンパイラはこのファイルからクラス定義全体を確認できません。たとえば、

myobject.h:

@class Something;
@interface MyObject
@property (retain) Something *delegate;
@end

myobject.m:

#import "myobject.h"

[self.delegate doItYouFool];

次に、コンパイラは、式'self.delegate'の結果がSomething*型であることを確認できますが、そのクラスの実際の定義を確認できないため、サポートされているメッセージを確認できません。これにより、通常、「前方定義」に関する警告が表示されます。これを修正するには、「something.h」を.mファイルにインポートして、コンパイラーが操作しているクラスについて完全に認識できるようにする必要があります。警告を消すには、idにキャストします

[(id)self.delegate doItYouFool];

もちろん、そのメッセージを定義するヘッダーファイルがインクルードされていないため、「doItYouFool」は既知のメソッドではないという警告が表示される場合もあります。

于 2012-06-26T23:16:08.277 に答える