Objective-C传递方法作为参数

时间:2011-10-29 01:50:30

标签: iphone objective-c ios xcode selector

如何将一个方法作为参数传递给另一个方法?我在课堂上这样做。

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 个答案:

答案 0 :(得分:45)

您要查找的类型是选择器(SEL),您可以像这样获得方法的选择器:

SEL littleSelector = @selector(littleMethod);

如果方法采用参数,您只需将:放在原处,如下所示:

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

此外,方法不是真正的函数,它们用于向特定类(以+开头)或特定实例(以 - 开头)发送消息。函数是C类型,并不像方法那样真正具有“目标”。

一旦你得到一个选择器,你就可以在你的目标(无论是类还是实例)上调用该方法,如下所示:

[target performSelector:someSelector];

这方面的一个很好的例子是UIControl addTarget:action:forControlEvents:方法,您通常以编程方式创建UIButton或其他控制对象时使用这种方法。

答案 1 :(得分:7)

另一种选择是看块。它允许您传递一个代码块(一个闭包)。

这是一个很好的关于块的文章:

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

这是苹果文档:

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

答案 2 :(得分:7)

Objective C使这个操作相对容易。 Apple提供this documentation

要直接解决您的问题,您不是在调用函数,而是调用选择器。以下是一些示例代码:

大功能:

+ (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]

编辑:修复发送的选择器(删除分号)

答案 3 :(得分:5)