簡體   English   中英

NSInvocation將C數組傳遞給Objective-C方法

[英]NSInvocation pass C-arrays to Objective-C method

我想在延遲后將C數組傳遞給Objective-C中的方法。 通常,我可以執行performSelector:withObject:afterDelay,但是我無法以任何方式更改數組或將它們轉換為NSMutableArrays,NSDictionaries或任何其他可可對象-它們必須是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]);

    }

}

你可以這樣做:

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

您的問題是間接尋址不足。 setArgument使用指針指向要設置為參數的值的位置,在您的情況下該值也是指針...使用傳遞的指針和類型信息setArgument可以復制正確的字節數。

所以你需要這樣的東西:

float *gun1_vertex_pointer = &gun1_vertex[0][0];
[inv setArgument:&gun1_vertex_pointer atIndex:2];

要在延遲后進行呼叫,請使用dispatch_after塊:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM