将函数指针添加到NSMutableArray

时间:2014-07-01 15:30:11

标签: ios objective-c xcode nsmutablearray selector

我需要在NSMutableArray

中添加一些功能

数组:

[_array addObject:@selector(myFunction:)];

功能:

- (void) myFunction:(NSString*)someParam {}

错误:

Incompatible pointer types sending 'SEL' to parameter 'id'

我该怎么做? :/

目的是随机调用数组函数

此致

3 个答案:

答案 0 :(得分:3)

您只能在NSArray中存储对象。但是SEL不是那些(它被定义为指向<objc/objc.h>中结构的指针)。

为了让您的选择器存储在数组中,您必须将其打包在NSValue对象中,如下所示:

[_array addObject:[NSValue valueWithPointer:@selector(myFunction:)]];

稍后,当您真正想要使用选择器时,您需要将其解压缩,如下所示:

SEL mySelector = [_array[0] pointerValue];

[target performSelector:mySelector];

答案 1 :(得分:1)

另一种选择是使用块。对于功能

-(void)myFunction{
}

通过执行类似

的操作创建一个块
void (^CallingBlock)()=^(){
    [self myFunction];
};

然后正常添加到数组

NSMutableArray *array=[[NSMutableArray alloc] init];
[array addObject:CallingBlock];

然后执行块

[[NSOperationQueue mainQueue] addOperationWithBlock:[array objectAtIndex:0]];

答案 2 :(得分:1)

您无法为数组添加选择器,因为SEL不是对象类型。

如果您需要存储方法和参数,可以创建一个NSInvocation对象并将其存储在数组中。