Sca*_*kko 17 objective-c variadic-functions ios automatic-ref-counting
我需要在iOS应用程序中创建一个假va_list的传递给NSString initWithFormat:arguments:函数,这是我的代码:
NSArray *fixedArguments = [[NSArray alloc] initWithArray:arguments];
NSRange range = NSMakeRange(0, [fixedArguments count]);
va_list fakeArgList = (va_list)malloc(sizeof(NSString *) * [fixedArguments count]);
__unsafe_unretained id *ptr = (__unsafe_unretained id *)fakeArgList;
[fixedArguments getObjects:ptr range:range];
content = [[NSString alloc] initWithFormat:outputFormat
arguments:(va_list)fakeArgList];
free(fakeArgList);
Run Code Online (Sandbox Code Playgroud)
编译器在转换线上抱怨此消息:
error: cast of a non-Objective-C pointer type 'va_list' (aka 'char *') to '__unsafe_unretained id *' is disallowed with ARC
Run Code Online (Sandbox Code Playgroud)
该getObjects:range:功能定义如下:
- (void)getObjects:(id __unsafe_unretained [])objects range:(NSRange)range;
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一切,但仍然无法摆脱这个错误......
是否有va_list启用ARC 创建假的解决方案?我究竟做错了什么?
ipm*_*mcc 31
编辑:这不再有效.正如在最初的答案中所预见的那样,ABI似乎已经从这个答案中改变了
玩了一下并让它工作 - 双重检查泄漏或遗弃的记忆,没有看到任何.
NSArray *fixedArguments = [[NSArray alloc] initWithObjects: @"foo", @"bar", @"baz", nil];
NSRange range = NSMakeRange(0, [fixedArguments count]);
NSMutableData* data = [NSMutableData dataWithLength: sizeof(id) * [fixedArguments count]];
[fixedArguments getObjects: (__unsafe_unretained id *)data.mutableBytes range:range];
NSString* content = [[NSString alloc] initWithFormat: @"1: %@ 2: %@ 3: %@" arguments: data.mutableBytes];
NSLog(@"%@", content);
Run Code Online (Sandbox Code Playgroud)
我喜欢(ab)像这样使用NSMutableData来获取任意内存块上的保留/释放语义 - 它不一定与手头的问题有关,但它是一个巧妙的小技巧.
作为对未来读者的一个注意事项:假装这样的va_list恰好适用于当前的MacOS和iOS ABI,但总的来说它不是可移植的,也不是一个好方法.
| 归档时间: |
|
| 查看次数: |
6046 次 |
| 最近记录: |