Objective-C 中可以将函数存储在数组中吗?

问题描述 投票:0回答:4

我想创建一个函数数组,以便我可以随机化函数的调用顺序。 我可以做这样的事情吗:

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

这样我就可以做这样的事情:

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

从而随机化这些函数的调用顺序?

如何将函数存储在数组中?

arrays objective-c function
4个回答
4
投票

对于 ObjC 块,您可以直接将它们存储在

NSArray
中。普通 C 函数必须包装成
NSValue
:

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

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

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

4
投票

我想到了一些方法

  1. 您可以将块存储在数组中
  2. 但是如果你想调用方法而不是块,你也可以在那里进行方法调用(你可以通过 NSInitation 来执行后者)
  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]

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

1
投票

块将是最好的方法,但我你不熟悉块或从蚂蚁其他原因你可以使用:NSSelectorFromStringNSStringFromSelector

已编辑

  1. 使用
    NSStringFromSelector
  2. 将方法存储在数组中
  3. 然后您可以按照此处所述对数组进行洗牌:洗牌数组
  4. 使用
    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];
 }];

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

© www.soinside.com 2019 - 2024. All rights reserved.