gpt4 book ai didi

objective-c - 如何在启用 ARC 的情况下从 char* 转换为 id*

转载 作者:太空狗 更新时间:2023-10-30 03:33:52 28 4
gpt4 key购买 nike

我正在尝试使用 here 中描述的技术构建“伪”变量参数列表,但对于支持 ARC 的项目,我无法弄清楚如何摆脱我遇到的错误。

这是有问题的代码:

NSMutableArray* argumentsArray = [NSMutableArray array];

// ... Here I fill argumentsArray with some elements
// And then, I want to construct a "fake" variable argument list

char* fakeArgList = (char*) malloc( sizeof(NSString*) * [argumentsArray count]);
[argumentsArray getObjects: (id*) fakeArgList];

NSString* content = [[NSString alloc] initWithFormat: formatString arguments:fakeArgList];

XCode 提示 (id) fakeArgList* 转换,说:

Cast of non-Objective-C pointer type 'char *' to '_autoreleasing id *' is disallowed with ARC

我最初的理论是我只需要将 __unsafe_unretained 添加到 (id*) casting 来告诉 ARC 我负责那 block 内存并且它不应该保留/释放它,但这不起作用并且我不知道如何解决这个问题。

更新:这是完整的功能。它应该采用 printf 样式的格式字符串和 .plist 中的可变字段名称列表,并输出带有从 .plist 加载的数据的格式化字符串。即,如果我有一个包含字段“field1”=“foo”和“field2”= 3 的 .plist 文件,我调用 [loadStringFromFixture: @"?param1=%@&param2=%d", @"field1", @field2] 然后我应该得到字符串 "?param1=foo&param2=3"

- (NSString*) loadStringFromFixture:(NSString*) format, ...
{
NSString* path = [[NSBundle mainBundle] bundlePath];
NSString* finalPath = [path stringByAppendingPathComponent:@"MockAPI-Fixtures.plist"];
NSDictionary* plistData = [NSDictionary dictionaryWithContentsOfFile:finalPath];

va_list argumentsList;
va_start(argumentsList, format);

NSString* nextArgument;
NSMutableArray* argumentsArray = [NSMutableArray array];

while((nextArgument = va_arg(argumentsList, NSString*)))
{
[argumentsArray addObject: [plistData objectForKey:nextArgument]];
}

NSRange myRange = NSMakeRange(0, [argumentsArray count]);

id* fakeArgList = (__bridge id *)malloc(sizeof(NSString *) * [argumentsArray count]);
[argumentsArray getObjects:fakeArgList range:myRange];
NSString * content = [[NSString alloc] initWithFormat:formatString
arguments:(__bridge va_list)fakeArgList];

free(fakeArgList);

return content;
}

最佳答案

看看这段代码,它似乎是一个非常肮脏的 hack,但我想如果它在没有 ARC 的情况下也能工作,它也应该 ARC 一起工作。这里的问题是你正在从 C 指针转换为 Objective-C 指针,如果没有桥接就无法做到这一点:

NSMutableArray * argumentsArray = [NSMutableArray array];

// ... Here I fill argumentsArray with some elements
// And then, I want to construct a "fake" variable argument list

NSRange myRange = NSMakeRange(0, [argumentsArray count]);
id * fakeArgList = (__bridge id *)malloc(sizeof(NSString *) * [argumentsArray count]);
[argumentsArray getObjects:fakeArgList range:myRange];
NSString * content = [[NSString alloc] initWithFormat:formatString
arguments:(__bridge va_list)fakeArgList];
free(fakeArgList);

这仍然很丑陋,我真的希望有更好的方法来做到这一点,但由于它是用于单元测试,我想它必须这样做。

编辑:桥接 Actor 可能应该像这样完成:

id __autoreleasing * fakeArgList = (__bridge id __autoreleasing *)malloc(sizeof(NSString *) * [argumentsArray count]);

关于objective-c - 如何在启用 ARC 的情况下从 char* 转换为 id*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919017/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com