web-dev-qa-db-fra.com

Méthodes de passage Objective-C en tant que paramètres

Comment passez-vous une méthode comme paramètre à une autre méthode? Je fais cela dans toutes les classes.

Classe A:

+ (void)theBigFunction:(?)func{
    // run the func here
}

Classe B:

- (void)littleBFunction {
    NSLog(@"classB little function");
}

// somewhere else in the class
[ClassA theBigFunction:littleBFunction]

Classe C:

- (void)littleCFunction {
    NSLog(@"classC little function");
}

// somewhere else in the class
[ClassA theBigFunction:littleCFunction]
29
Jacksonkr

Le type que vous recherchez est sélecteur (SEL) et vous obtenez le sélecteur d'une méthode comme ceci:

SEL littleSelector = @selector(littleMethod);

Si la méthode prend des paramètres, vous mettez simplement : où ils vont, comme ceci:

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

De plus, les méthodes ne sont pas vraiment des fonctions, elles sont utilisées pour envoyer des messages à une classe spécifique (lors du démarrage avec +) ou à une instance spécifique de celle-ci (lors du démarrage avec -). Les fonctions sont de type C qui n'ont pas vraiment de "cible" comme les méthodes.

Une fois que vous obtenez un sélecteur, vous appelez cette méthode sur votre cible (que ce soit une classe ou une instance) comme ceci:

[target performSelector:someSelector];

Un bon exemple de ceci est UIControl's addTarget: action: forControlEvents: méthode que vous utilisez habituellement lors de la création de UIButton ou d'autres objets de contrôle par programme.

45
Filip Radelic

Une autre option consiste à examiner les blocs. Il vous permet de faire circuler un bloc de code (une fermeture).

Voici une bonne écriture sur les blocs:

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

Voici les documents Apple:

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

8
bryanmac

L'objectif C rend cette opération relativement facile. Apple fournit cette documentation .

Pour répondre directement à votre question, vous n'appelez pas une fonction, mais un sélecteur. Voici un exemple de code:

Grande fonction:

+ (void)theBigFunction:(SEL)func fromObject:(id) object{
    [object preformSelector:func]
}

Alors pour la classe B:

- (void)littleBFunction {
    NSLog(@"classB little function");
}

// somewhere else in the class
[ClassA theBigFunction:@selector(littleBFunction) fromObject:self]

Alors pour la classe C:

- (void)littleCFunction {
    NSLog(@"classC little function");
}

// somewhere else in the class
[ClassA theBigFunction:@selector(littleCFunction) fromObject:self]

EDIT: correction des sélecteurs envoyés (supprimer le point-virgule)

7
MJD
5
ARC