0

ここで「懸念」を引き起こしているものを手に入れました...

キーボードを使用するモーダル ビュー コントローラーがあります。私はシステムを使用して、キーボードの外側のタップを認識してそれを却下する「新しい方法」であるように見えるstackoverflowのコードからキーボードを却下しています...

// Register for keyboard dismissal
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification) 
{
     UITapGestureRecognizer *tap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)]autorelease];
     tap.numberOfTapsRequired = 1;
     tap.numberOfTouchesRequired = 1;
     tap.delegate = self;
     [self.view addGestureRecognizer:tap];
}];

[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *notification) 
{
    [self.view removeGestureRecognizer:[self.view.gestureRecognizers lastObject]];
}];

これはうまく機能しますが、[完了] ボタンでビュー コントローラーを閉じると、ビュー コントローラーで dealloc が呼び出されないことに気付きました。

上記のコードと関係があるようです。通知定義の中かっこ内の実行可能コードをコメント アウトすると、コントローラーが閉じられたときに dealloc が呼び出されます (キーボードが表示されていないか、閉じられていないため、中かっこ内のコードは実行されません)。

上記のコードが実装されているときに dealloc が呼び出されない理由について、何か提案はありますか?

ありがとう

合う

4

1 に答える 1

1

ブロックを使用している間は「自己」が保持されるため、オブザーバーを削除してロックを解除する必要があります。

于 2012-05-12T07:28:36.867 に答える