你能在Objective C中的数组中存储函数吗?

时间:2014-02-09 14:16:23

标签: ios objective-c arrays function random

我想创建一个函数数组,以便我可以随机化这些数组发生的顺序。 我可以这样做:

NSMutableArray *MyArray = [NSMutableArray arrayWithObjects: function1, function2, function3, nil];

所以,如果我能做这样的事情,那么

RandomNum = arc4random() %([MyArray count]);
MyArray[RandomNum];

这样随机化调用这些函数的顺序? 如何将函数存储在此数组中?

4 个答案:

答案 0 :(得分:4)

对于ObjC阻止,您可以直接将它们存储在NSArray中。普通C函数必须包含在NSValue

NSArray *functions = @[[NSValue valueWithPointer:function1], [NSValue valueWithPointer:function2]];

然后您可以按照以下方式调用它们,只需确保将其转换为正确的签名:

((void (*)(int))[functions[RandomNum] pointerValue])(10);

答案 1 :(得分:4)

有想法的方法

  1. 您可以将数据块存储在数组中
  2. 但如果你想调用方法而不是块(你可以通过NSInvocation执行后者),你也可以在那里进行方法调用。
  3. 对于C函数,将它们包装在NSValue中以存储它们并稍后调用它们

  4. 样本1 - 块

        NSMutableArray *array = [NSMutableArray array];
        [array addObject:^{ /* block */ }];
    

    样本2 - 调用

        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[object methodSignatureForSelector:selector]];
        invocation.target = object;
        invocation.selector = selector;
        [array addObject:invocation];
    

    样本3 - C函数

        [NSValue valueWithPointer:function1]
    

答案 2 :(得分:1)

阻止将是最好的方法,但我不熟悉你可以使用的阻止或蚂蚁其他原因:NSSelectorFromString& NSStringFromSelector

<强> EDITED

  1. 使用NSStringFromSelector
  2. 将方法存储在数组中
  3. 然后您可以按照此处所述对数组进行随机播放:Shuffling array
  4. 使用NSSelectorFromString调用函数。
  5. 例如

    NSArray * functions = @[NSStringFromSelector(selector1),NSStringFromSelector(selector2),
    NSStringFromSelector(selector3),NSStringFromSelector(selector4)];
    
    //shuffle the array (see link)
     [functions shuffle];
    
     [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
           [self performSelector:NSSelectorFromString(functions[idx]) withObject:nil];
     }];
    

    (代码是动态编写的,请查看)。

答案 3 :(得分:1)

存储指向数组中函数的指针并调用函数:

#import <Foundation/Foundation.h>

static void hello() {
    NSLog(@"hey\n");
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSPointerArray *array = [NSPointerArray pointerArrayWithOptions:NSPointerFunctionsOpaqueMemory];
        [array addPointer: &hello];
        void* ptr = [array pointerAtIndex:0];
        ((void (*)(void)) ptr)(); // prints hey
    }
}