2013-01-31 8 views
10

私はこのようにINITを書きますプロトコル。initは

私はすなわちUIAlertView initメソッドは次のように見えることに気づいしかし:

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

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

+0

私はそれらを追加するのが面倒すぎると思っていました。あるいは、すべてのUIAlertViewDelegateメソッドがオプションなので、デリゲートがプロトコルに準拠しているかどうかは関係ありません。 – howanghk

+0

この場合には何のメリットもありません。プロトコルをクラスに準拠させることは苦痛になります。 – holex

答えて

1

私の理解では、APIは、数年前に大混乱だったと、彼らはまだすべてのこれらの問題を修正していることです。

最近まで、多くのプロトコルが非公式で、APIのほとんどの部分では、代理人はidとしてしか見つかりませんでした。 Appleはすべてのバージョンで段階的に修正しています。たとえば、公式NSURLConnectionの代理人がiOS 6.0に付属しています。 iOS 6.1では、idの戻り値の型の一部がinstancetypeに変更されています。

まあ、これはヘッダファイルをチェックした後、私の最初のアイデアだった:

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

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

4

良い質問!私はコンパイル時に多くのエラーを捕まえたいという希望で同じことをします。

アップルは自分の規格に準拠しているようです。 Concepts in Objective-Cに述べたように:

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

は、あなたのクラスのヘッダーファイルに、デリゲートアクセサメソッドを宣言します。

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

アクセサメソッドを実装します。メモリ管理プログラムでは、保持サイクルを避けるために、setterメソッドはデリゲートを保持またはコピーすべきではありません。

- (id)delegate { 
    return delegate; 
} 

- (void)setDelegate:(id)newDelegate { 
    delegate = newDelegate; 
} 
+0

UITableView.hをチェックすると、@property(nonatomic、assign)id delegate;を見ることができるので、それらを混ぜ合わせるようです:-) –