【问题标题】:Can you store functions in an array in Objective C?你可以在Objective C中将函数存储在数组中吗?
【发布时间】:2014-02-09 14:16:23
【问题描述】:

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

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

如果我能做这样的事情;

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

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

【问题讨论】:

标签: ios objective-c arrays function random


【解决方案1】:

对于 ObjC 块,您可以直接将它们存储在 NSArray 中。普通的 C 函数必须包装到 NSValue

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

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

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

【讨论】:

    【解决方案2】:

    想到办法

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

    样本 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]
    

    【讨论】:

      【解决方案3】:

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

      #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
          }
      }
      

      【讨论】:

        【解决方案4】:

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

        已编辑

        1. NSStringFromSelector将方法存储在数组中
        2. 然后您可以按照此处所述对数组进行洗牌:Shuffling array
        3. 使用NSSelectorFromString调用函数。

        举例

        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];
         }];
        

        (代码是即时编写的,请查看)。

        【讨论】:

          猜你喜欢
          • 2010-12-02
          • 2011-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-18
          • 1970-01-01
          • 2011-01-11
          相关资源
          最近更新 更多