Это обратный вызов, используемый AppKit, чтобы понять, как работает ваше представление. Вы не должны основывать какие-либо решения на том, как часто или редко этот метод вызывается.
Если вам действительно любопытно, почему он вызывается более одного раза, вы можете догадаться, поместив точку останова внутри метода. Когда достигается точка останова, посмотрите на обратную трассировку, чтобы увидеть имена методов AppKit выше стека.
Например, представьте код в AppKit, как этот пример, который, по общему признанию, придуман:
- (void)_syncFirstResponderStatusOfView:(NSView *)view withWindow:(NSWindow *)window {
if ((view == [window firstResponder]) && ![view acceptsFirstResponder]) {
// Perhaps the view changed its mind about accepting first responder
[window _makeFirstResponder:nil];
} else if ((view != [window firstResponder]) && [view acceptsFirstResponder]) {
[window _makeFirstResponder:view];
}
}
Этот код вызывает [view acceptFirstResponder] дважды. Вы также можете представить себе значение, проверяемое в одной функции, и на основе результата представление передается другой функции, которая также проверяет снова, возможно, потому что его можно ввести через несколько путей кода, и это было наиболее простым делом - написать это.