10

プロトコルに準拠するデリゲートを持つinitを作成するときはいつでも、次のようにinitを記述します。

- (id)initWithDelegate:(id<ProtocolToConform>)delegate;

このようにして、作成中のオブジェクトがプロトコルに準拠していない場合に警告が表示されます。

UIAlertViewただし、 initメソッドは次のようになっていることに気付きました。

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...

UIAlertViewDelegateデリゲート引数は、プロトコルに準拠するように指定していませんか?Appleがそれをそのようにした理由の手がかりはありますか?

4

2 に答える 2

4

良い質問!コンパイル時にさらに多くのエラーをキャッチすることを期待して、同じことを行います。

Appleは独自の基準に準拠しているようです。Objective-Cの概念で述べられているように:

カスタムクラスのデリゲートを実装するには、次の手順を実行します。

クラスヘッダーファイルでデリゲートアクセサメソッドを宣言します。

- (id)delegate;
- (void)setDelegate:(id)newDelegate;

アクセサメソッドを実装します。メモリ管理プログラムでは、保持サイクルを回避するために、setterメソッドはデリゲートを保持またはコピーしないでください。

- (id)delegate {
    return delegate;
}
 
- (void)setDelegate:(id)newDelegate {
    delegate = newDelegate;
}
于 2013-01-31T13:22:00.330 に答える
2

私の理解では、APIは数年前は大きな混乱でしたが、まだこれらすべての問題を修正しています。

最近まで、多くのプロトコルは非公式であり、APIのほとんどすべての場所で、デリゲートはとしてのみ見つけることができましたid。Appleは、すべてのバージョンで段階的に修正しています。たとえば、正式なNSURLConnection代表者はiOS6.0に付属しています。idまたは、iOS 6.1では、一部のリターンタイプがに変更されていることに注意してくださいinstancetype

さて、これはヘッダーファイルをチェックした後の私の最初のアイデアでした:

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate

誰かがプロトコルを宣言に追加したかったのは明らかですが、コメントだけを追加しました。互換性のためのプロトコルなしで彼らがそれを残したと私は推測しています。

于 2013-01-31T13:42:52.930 に答える