Зачем использовать performSelector: withObject: withObject во время выполнения, если вы знаете как селектор, так и его аргументы во время компиляции?

Я только что наткнулся на код в Three20, который выглядит примерно так:

  SEL sel = @selector(textField:didAddCellAtIndex:);
  if ([self.delegate respondsToSelector:sel]) {
    [self.delegate performSelector:sel withObject:self withObject:(id)_cellViews.count-1];
  }

В LLVM 2.0 это вызывает ошибку компиляции:

ошибка: арифметика по указателю на интерфейс 'id', который не является постоянным размером в нехрупком ABI

. Я знаю, почему возникает эта ошибка, и знаю, как ее исправить. Мне просто нужно вызвать метод напрямую, например:

  SEL sel = @selector(textField:didAddCellAtIndex:);
  if ([self.delegate respondsToSelector:sel]) {
    [self.delegate textField:self didAddCellAtIndex:(_cellViews.count - 1)];
  }

Мой вопрос: если вы знаете как селектор, так и его аргументы во время компиляции, зачем вам использовать performSelector: withObject: withObject: во время выполнения? Я вообще не понимаю, почему код был написан именно так. Если селектор и аргументы были динамически переданы в метод, я могу понять, но это не так, селектор и его аргументы жестко закодированы (даже если индекс действительно изменяется во время выполнения, его метод получения индекса сложен закодировано.)

Если бы кто-нибудь мог объяснить мне вескую причину, почему это было необходимо, я был бы благодарен. В противном случае я буду здесь менять весь этот код.

6
задан Jasarien 5 February 2011 в 00:49
поделиться