我想创建一个函数数组,以便我可以随机化函数的调用顺序。 我可以做这样的事情吗:
NSMutableArray *MyArray =
[NSMutableArray arrayWithObjects: function1, function2, function3, nil];
这样我就可以做这样的事情:
RandomNum = arc4random() %([MyArray count]);
MyArray[RandomNum];
从而随机化这些函数的调用顺序?
如何将函数存储在数组中?
对于 ObjC 块,您可以直接将它们存储在
NSArray
中。普通 C 函数必须包装成 NSValue
:
NSArray *functions = @[[NSValue valueWithPointer:function1], [NSValue valueWithPointer:function2]];
然后您可以按如下方式调用它们,只需确保将其转换为正确的签名即可:
((void (*)(int))[functions[RandomNum] pointerValue])(10);
我想到了一些方法
样本 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]
将指向函数的指针存储在数组中并调用该函数:
#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
}
}
块将是最好的方法,但我你不熟悉块或从蚂蚁其他原因你可以使用:NSSelectorFromString&NSStringFromSelector。
已编辑
NSStringFromSelector
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];
}];
(代码是即时编写的,请查看)。