Подтвердить что ты не робот

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]
4b9b3361

Ответ 1

Тип, который вы ищете, - это селектор (SEL), и вы получаете селектор методов следующим образом:

SEL littleSelector = @selector(littleMethod);

Если метод принимает параметры, вы просто кладете : туда, куда они идут, например:

SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:);

Кроме того, методы не являются действительно функциями, они используются для отправки сообщений определенному классу (при запуске с +) или конкретным экземпляром его (при запуске -). Функции - это C-тип, который действительно не имеет "целевых" методов.

Как только вы получите селектор, вы вызываете этот метод на своей цели (будь то класс или экземпляр) следующим образом:

[target performSelector:someSelector];

Хорошим примером этого является UIControl addTarget: действие: forControlEvents: метод, который вы обычно используете при создании UIButton или некоторых других объектов управления программным способом.

Ответ 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: Исправить выбранные селектора (удалить точку с запятой)