Методы передачи Objective-C в качестве параметров - PullRequest
28 голосов
/ 29 октября 2011

Как передать один метод в качестве параметра другому методу? Я делаю это в разных классах.

Класс 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]

Ответы [ 4 ]

45 голосов
/ 29 октября 2011

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

SEL littleSelector = @selector(littleMethod);

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

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

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

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

[target performSelector:someSelector];

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

8 голосов
/ 29 октября 2011

Другой вариант - посмотреть на блоки.Это позволяет вам передавать блок кода (замыкание) вокруг.

Вот хорошая запись по блокам:

http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

Вот яблочные документы:

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

7 голосов
/ 29 октября 2011

Цель 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]

РЕДАКТИРОВАТЬ: Исправить отправленные селекторы (удалить точку с запятой)

5 голосов
/ 29 октября 2011

Вы можете использовать блоки для этой цели.http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

...