Objective-C методы передачи в качестве параметров
Как передать один метод в качестве параметра другому методу? Я делаю это через классы.
Класс A:
+ (void)theBigFunction:(?)func{
// run the func here
}
Класс B:
- (void)littleBFunction {
NSLog(@"classB little function");
}
// somewhere else in the class
[ClassA theBigFunction:littleBFunction]
Класс C:
- (void)littleCFunction {
NSLog(@"classC little function");
}
// somewhere else in the class
[ClassA theBigFunction:littleCFunction]
Ответы
Ответ 1
Тип, который вы ищете, - это селектор (SEL
), и вы получаете селектор методов следующим образом:
SEL littleSelector = @selector(littleMethod);
Если метод принимает параметры, вы просто кладете :
туда, куда они идут, например:
SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:);
Кроме того, методы не являются действительно функциями, они используются для отправки сообщений определенному классу (при запуске с +) или конкретным экземпляром его (при запуске -). Функции - это C-тип, который действительно не имеет "целевых" методов.
Как только вы получите селектор, вы вызываете этот метод на своей цели (будь то класс или экземпляр) следующим образом:
[target performSelector:someSelector];
Хорошим примером этого является UIControl
addTarget: действие: forControlEvents: метод, который вы обычно используете при создании UIButton
или некоторых других объектов управления программным способом.
Ответ 2
Другой вариант - посмотреть на блоки. Он позволяет передавать блок кода (закрытие).
Здесь хорошая запись в блоках:
http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1
Здесь apple docs:
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html
Ответ 3
Цель C делает эту операцию относительно легкой. Apple предоставляет эту документацию.
Чтобы напрямую задать свой вопрос, вы не вызываете функцию, а селектор. Вот пример кода:
Большая функция:
+ (void)theBigFunction:(SEL)func fromObject:(id) object{
[object preformSelector:func]
}
Тогда для класса B:
- (void)littleBFunction {
NSLog(@"classB little function");
}
// somewhere else in the class
[ClassA theBigFunction:@selector(littleBFunction) fromObject:self]
Тогда для класса C:
- (void)littleCFunction {
NSLog(@"classC little function");
}
// somewhere else in the class
[ClassA theBigFunction:@selector(littleCFunction) fromObject:self]
EDIT: Исправить выбранные селектора (удалить точку с запятой)
Ответ 4
Вы можете использовать блоки для этой цели. http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html