2

我想在延迟后将 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]);

    }

}
4

3 回答 3

3

你可以这样做:

-(void) testMethod:(NSData *) arrayone secondArray:(NSData *) arraytwo
{
    float **gun1_vertex = (float **)[arrayone bytes];
    float **gunDown1_vertex = (float **)[arraytwo bytes];

    // ...
}

NSData *gun1data = [NSData dataWithBytes:(void *)gun1_vertex     length:sizeof(float) * 24 * 8];
NSData *gun1downData = [NSData dataWithBytes:(void *)gunDown1_vertex length:sizeof(float) * 24 * 8];

[inv setArgument:&gun1data atIndex:2];
[inv setArgument:&gun1downData atIndex:3];
于 2012-01-31T01:45:56.653 回答
3

你的问题是不够间接。setArgument指针指向您希望设置为参数的值的位置,并且在您的情况下该值也是一个指针...使用传递的指针和类型信息setArgument可以复制正确的字节数。

所以你需要类似的东西:

float *gun1_vertex_pointer = &gun1_vertex[0][0];
[inv setArgument:&gun1_vertex_pointer atIndex:2];
于 2012-01-31T01:48:27.083 回答
1

要在延迟后拨打电话,请使用dispatch_afterblock:

    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self testMethod:&gun1_vertex[0][0] secondCArray:&gunDown1_vertex[0][0]];
    });
于 2012-01-31T01:33:57.107 回答