私は他の誰かの iOS プロジェクトで作業しています。ARC は有効になっています (私の知る限り、常に有効になっています)。コードには、いくつかのビュー コントローラーのインスタンスを作成し、そのデリゲートを自分自身に設定してから表示するボタン プレス ハンドラーが散らばっています。
- (IBAction)keyButton:(id)sender {
MyViewController *controller = [[MyViewController alloc] init];
controller.delegate = self;
[self.navigationController pushViewController:controller animated:YES];
}
MyViewController は、音楽キーを選択するためのスピン ウィジェットを表示します。選択したら、ユーザーは選択したキーを使用して音楽を作成するために押し戻します。これらは唯一のユーザー インタラクションであり、バックグラウンド プロセスなどはありません。
MyViewController.h ファイルでは、デリゲートは次のように宣言されています。
@interface MyViewController : UIViewController {
id <ModuleUpdateDelegate> _delegate;
}
@property (nonatomic,strong) id delegate;
2 つの質問があります。
- 元の作成者が、ボタンを押すたびに MyViewController の新しいインスタンスを作成することを選択したのはなぜでしょうか?
- そのような各インスタンスの所有者は誰ですか? 【いつ】壊れるの?デリゲートへの強い参照を保持しているため、現在の実装は [ボタンを押すたびに] 強い参照サイクルを作成していますか?
私自身の本能は、デリゲートにプライベートな MyViewController * プロパティを作成することです。このプロパティは、最初にボタンを押したときにのみ読み込まれます。次に、一般的な推奨に従って、MyViewController のデリゲート プロパティを強力ではなく弱くします。しかし、私が言ったように、現在の実装は非常にユビキタスなので、最初にそれがどのように機能するかを理解せずに何かを変更するのは気が進まない.
どんな助けでも大歓迎です。