Хорошо, сначала .... IBAction
на самом деле не означает ничего особенного, кроме Interface Builder. В основном:
#define IBAction void
Поэтому, когда вы видите IBAction
, думаю, "пустота". Единственная причина, по которой он существует, - это флаг, указывающий Interface Builder, что метод является допустимым методом для подключения управляющих действий. Компилятор Objective-C не должен знать об этом, и поэтому он определен как void, поскольку все методы «действия» возвращают void.
Во-вторых, методы действий также имеют один аргумент, который может быть объектом любого числа типов. Из-за этого предполагается, что методы действия должны использовать тип id
как тип аргумента. Таким образом, им может передаваться указатель на любой объект Objective-C, не вызывая при этом компилятор генерировать ошибку проверки типа.
Так обычно действия должны работать что-то вроде этого:
- (IBAction)myAction:(id)sender {
if (sender == self.someButton) {
UIButton *button = (UIButton *)sender;
...
return;
} else if (sender == self.someControl) {
UIControl *control = (UIControl *)sender;
...
return;
}
}
Другими словами, id
почти как нетипизированного указатель, как void *
обычно используется в C, когда некоторая функция должна принимать указатель на что-то неизвестного типа. sender
могут быть разными типами управления, поэтому используется нечто общее, например id
, тогда отправитель передается в нечто более конкретное, как только код знает, что это такое.
В любом случае, нет никаких оснований определять что-либо как имеющее тип возврата IBAction
, если вы не собираетесь использовать этот метод в качестве целевого действия в Interface Builder. Наличие IBAction в вашем делете приложения кажется необычным ....
Почему отрицательный голос? :-( – 0SX