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 被调用 ok....(键盘未显示或解除,因此大括号内的代码未执行)

有没有人对为什么在实现上述代码时不调用 dealloc 有任何建议?

谢谢

适合

4

1 回答 1

1

使用块时,它将保留“自我”,因此您需要删除观察者以解除分配。

于 2012-05-12T07:28:36.867 回答