基本的に、必要に応じてジェスチャ レコグナイザーを作成、追加、および削除できます。そして、「それが理にかなっている場合」は、いくつかのことによって異なりますが、通常は、それらを ivar として保持するかどうかによって異なります。ARC
重要なのは、強い参照を管理することです。with ARC
ivar はデフォルトで強力です。
では、タップ認識エンジンを追加するとしましょう。このシナリオでは、認識エンジンに再度アクセスする必要はありません。私は次のように作成します:
-(void)viewDidLoad{
[super viewDidLoad];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.view addGestureRecognizer:tap];
}
このシナリオでは、このレコグナイザーを管理するために他に何もする必要はありません。ビューシステムはそれを強く参照しています。あなたがすることは、座って電話がかかるのを待つことだけですhandleTap:
。ビューがアンロードされると、このタップ認識エンジンの割り当てが解除されます。
viewWillAppear:
このシナリオは、複数のレコグナイザーの作成につながる一連のイベントを想像するのは難しくないため、このレコグナイザーを追加するのにも適していません。
したがって、論理的には、アピアランス メソッドにレコグナイザーを追加する場合は、ivar でそれらへの何らかの参照を保持する必要があります。しかし、これも必ずしも悪い考えではありません。一般に、レコグナイザーへの参照が必要な理由は、<UIGestureRecognizerDelegate>
メソッドが使用されている場合にメソッドのロジックを支援するためです。
initWith..
個人的には、後で添付するメソッドに認識エンジンを追加することは決してありません。唯一の利点は、そこで作成したレコグナイザーは、View Controller の全期間にわたって保持されることです。しかし、レコグナイザーはかなり明確にビュー システムの一部であるため、この種の混乱MVC
は Cocoa が得意とするところです。また、メモリ不足の状態では、ナビゲーション スタック上のコントローラのビューが削除されますが、この場合、レコグナイザーは実際の理由もなく (巨大なオブジェクトではなく) メモリを使用し続ける可能性があります。
view(Will/Did)Appear:
メソッドにレコグナイザーを追加し、 view(Will/Did)Disappear:
. 私の好みではありません。ビューが表示されて削除された、またはmodal
ナビゲーションが発生したという理由だけで、レコグナイザーを削除して再度追加する必要があるとは思いません。push
pop
viewDidLoad
レコグナイザーをインスタンス化してアタッチするために、ほぼ常に を使用することをお勧めします。viewDidUnload
メモリ不足の状況で役立つように、それらへの強い参照を無効にすることを忘れないでください。またARC
、dealloc で ivar を使用する必要はありません。