[英]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.