[解決済み] Objective-Cでコールバックを実行する方法
質問
Objective-Cでコールバック関数を実行するにはどうしたらよいでしょうか。
完成した例を見て、理解したいのですが。
どのように解決するのですか?
通常、オブジェクトCのコールバックはデリゲートで行われます。ここでは、カスタムのデリゲートを実装した例を示します。
ヘッダーファイルです。
@interface MyClass : NSObject {
id delegate;
}
- (void)setDelegate:(id)delegate;
- (void)doSomething;
@end
@interface NSObject(MyDelegateMethods)
- (void)myClassWillDoSomething:(MyClass *)myClass;
- (void)myClassDidDoSomething:(MyClass *)myClass;
@end
実装(.m)ファイル
@implementation MyClass
- (void)setDelegate:(id)aDelegate {
delegate = aDelegate; /// Not retained
}
- (void)doSomething {
[delegate myClassWillDoSomething:self];
/* DO SOMETHING */
[delegate myClassDidDoSomething:self];
}
@end
これは一般的なアプローチを示しています。NSObjectにカテゴリを作り、コールバックメソッドの名前を宣言します。NSObject は実際にはこれらのメソッドを実装しません。このタイプのカテゴリは非公式なプロトコルと呼ばれ、多くのオブジェクトがこれらのメソッドを実装する可能性があると言っているだけです。これらは、セレクタの型シグネチャを前方に宣言する方法です。
次に、あるオブジェクトを "MyClass" のデリゲートとし、MyClass はデリゲートのメソッドを適宜呼び出すようにします。デリゲートコールバックがオプションである場合、通常、ディスパッチサイトで "if ([delegate respondsToSelector:@selector(myClassWillDoSomething:)) {" のようにガードすることになるでしょう。この例では、デリゲートは両方のメソッドを実装することが要求されています。
非公式なプロトコルの代わりに、@protocolで定義された正式なプロトコルを使用することもできます。その場合は、デリゲートのセッター、インスタンス変数の型を".に変更することになります。
id <MyClassDelegate>
の代わりに "とします。
id
となります。
また、デリゲートが保持されていないことに気づかれるでしょう。これは通常、"MyClass" のインスタンスを所有するオブジェクトがデリゲートでもあるために行われるものです。もしMyClassがそのデリゲートを保持したら、retainサイクルが発生します。MyClassのインスタンスを持ち、そのデリゲートであるクラスのdeallocメソッドで、デリゲートの参照をクリアするのは良いアイデアです。そうしないと、何かが MyClass インスタンスを生かしている場合、ポインタがぶら下がったままになってしまうからです。
関連
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] クラス vs. #インポート
-
[解決済み] Objective-CでNSNotificationCenterを通してメッセージを送受信する?
-
[解決済み] IOSのUIViewからアプリケーションのドキュメントフォルダに画像を保存する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜObjective-Cのファイルには.mという拡張子がついているのですか?
-
[解決済み] Objective-Cで配列に結合する
-
[解決済み] error: Writeable atomic property cannot pair with synthesized setter/getter and the user defined setter/getter.
-
[解決済み] Xcodeはクラッシュの原因となる行を表示しない
-
[解決済み] RootViewControllerのスイッチングアニメーション
-
[解決済み] Objective-CのクラスでSwiftのプロトコルをインポートする
-
[解決済み] Objective-Cです。カテゴリ内のプロパティ/インスタンス変数
-
[解決済み] iOSの合成されたプロパティの名前を、先頭のアンダースコアで変更するのはなぜですか?重複
-
[解決済み] performSelectorの使用: メソッドを呼び出すだけと比較した場合
-
[解決済み] 別のUIViewの下にあるUIViewとのインタラクションを許可する