【发布时间】:2012-01-31 00:45:31
【问题描述】:
我想在延迟后将 C 数组传递给 Objective-C 中的方法。通常我可以执行Selector:withObject:afterDelay,但我不能以任何方式更改数组或将它们转换为 NSMutableArrays、NSDictionaries 或任何其他 Cocoa 对象——它们必须是 C 数组。在我对 StackOverflow 和 Google 的研究中,我发现传递 C 原语的一种方法是将它们包装在 NSInvocation 中。我尝试使用下面的代码执行此操作,并将参数设置为指向正在传递的数组的指针。
float gun1_vertex[24][8] = { {data,...data},{data,...data}, ... {data,...data} };
float gunDown1_vertex[24][8] = { {data,...data},{data,...data}, ... {data,...data} };
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(testMethod:secondCArray:)]];
[inv setSelector:@selector(testMethod:secondCArray:)];
[inv setTarget:self];
[inv setArgument:&gun1_vertex[0][0] atIndex:2];
[inv setArgument:&gunDown1_vertex[0][0] atIndex:3];
[inv performSelector:@selector(invoke) withObject:nil afterDelay:0.1f];
当我尝试在下面的方法中从传递的数组中打印一些值时,我的测试应用程序不断崩溃。我可能只是错过了一些完全明显的东西。有人可以在这里阐明一下吗?
- (void)testMethod:(float *)test secondCArray:(float *)test2 {
for ( int a = 0 ; a < 10 ; a++ ) {
NSLog(@"%f %f",test[a],test2[a]);
}
}
【问题讨论】:
-
你能改变接受对象的方法吗?如果是这样,您可以将字节粘贴到
NSData中,然后在另一侧解压。 -
@JoshCaswell:或者只是创建一个中间“thunk”方法来进行解包,然后转身并调用所需的目标方法。
-
不,我不能修改 C 数组。 NSInvocation 的语法看起来不错吗?看起来它应该可以工作 - 指向多维数组的第一个元素的指针,然后在传递给 testMethod 后打印出一些值。我在 NSLog 行收到了 EXC_BAD_ACCESS。
-
@quixoto:好主意。 phil:我们不建议修改数组,只是将它们放在一个包装器中。关于。 EXC_BAD_ACCESS:你确定调用方法时内存仍然有效吗?
NSInvocation复制你给它的指针,但它不能复制数据本身,因为它不知道有多少。 -
哦,也许包装它就可以了。你能告诉我你是如何在 NSData 中打包/解包它的吗?我确信数据仍然有效,因为它是从头文件导入的,并且是一个静态顶点数组。
标签: iphone objective-c cocoa nsinvocation performselector