1

所以我读过这个问题,这似乎正是我遇到的那种问题,但那篇文章中的答案并没有解决我的问题。我正在尝试编写NSMutableData. 有问题的函数头如下所示:

-(void)readString:(__autoreleasing NSString **)str

我在函数中进行了一些数据操作,以获取与数据流中的下一个字符串相对应的特定字节,然后调用此行:

*str = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];

此代码中没有错误。但是当我尝试像这样调用函数时:

+(id) deserialize:(SerializableData *)data
{
    Program *newProgram = [[Program alloc] init];

    [data readString:&(newProgram->programName)];

在我实际调用该函数的行上,我收到以下错误:

将非本地对象的地址传递给 __autoreleasing 参数以进行回写

我尝试将 放在__autoreleasing声明NSString的前面,第一个前面*,以及两者之间*,但是所有配置都会产生错误。

我是在阅读另一个问题时错过了什么,还是自那篇帖子发布以来ARC编译器中的某些内容发生了变化?

编辑:

似乎问题出在我尝试访问字符串的方式上。我可以通过执行以下操作来解决它:

NSString* temp;
[data readString&(temp)];
newProgram.programName = temp;

但我宁愿直接访问 ivar

4

1 回答 1

1

你不能。您可能会从 LLVM 的文档Automatic Reference Counting中获得洞察,特别是第 4.3.4 节。“通过写回传递给输出参数”。但是,除了您无法做到这一点(具体而言,这未在“法律表格”中列出)之外,实际上并没有太多额外的细节,您已经弄清楚了。尽管也许您会发现其中的原理很有趣。

于 2012-05-17T20:11:32.277 回答