Ios 使用ARC的输出参数

Ios 使用ARC的输出参数,ios,automatic-ref-counting,Ios,Automatic Ref Counting,所以我读过这个问题,这似乎正是我面临的问题,但那篇文章中的答案并不能解决我的问题。我正在尝试编写NSMutableData的数据序列化子类。有问题的函数头如下所示: -(void)readString:(__autoreleasing NSString **)str 我在函数中进行了一些数据操作,以获得与数据流中的下一个字符串相对应的特定字节,然后调用此行: *str = [[NSString alloc] initWithData:strData encoding:NSUTF8StringE

所以我读过这个问题,这似乎正是我面临的问题,但那篇文章中的答案并不能解决我的问题。我正在尝试编写
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)];
在我实际调用函数的那一行,我得到以下错误:

将非本地对象的地址传递给_自动释放参数以进行回写

我已尝试将
\uuu自动释放
放在
NSString
声明前面、第一个
*
前面以及两个
*
之间,但所有配置都会生成错误

在阅读另一个问题时,我是否遗漏了一些内容,或者自那篇文章发表以来,ARC编译器中的某些内容发生了变化

编辑:

问题似乎来自我试图访问字符串的方式。我可以这样做来解决这个问题:

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

但是我宁愿直接访问ivar,你不能。您可能会从LLVM的文档(特别是第4.3.4节)中获得见解。“通过写回传递到输出参数”。然而,除了你不能做的事情之外,真的没有太多额外的细节(特别是,这没有列在“法律表格”中),你已经弄明白了。尽管你可能会发现这个理由很有趣。

你不能。您可能会从LLVM的文档(特别是第4.3.4节)中获得见解。“通过写回传递到输出参数”。然而,除了你不能做的事情之外,真的没有太多额外的细节(特别是,这没有列在“法律表格”中),你已经弄明白了。尽管您可能会发现原理很有趣。

您不能直接使用ivar,因为分配的值将自动恢复。自动释放对于ivars来说总是一个坏主意,所以ARC允许它。使用局部变量
temp
,ARC将添加所需的retain。您不能直接使用ivar,因为分配的值将自动删除。自动释放对于ivars来说总是一个坏主意,所以ARC允许它。使用本地变量<代码> TEMP,ARC将添加所需的保留。HMM,不幸的是,我不能直接访问这些IVARS,我想我还是有点太过C++程序员的心。谢谢你的文档,它绝对值得一读,不幸的是我不能直接访问那些IVARS,我想我还是有点太过C++程序员了。嗯,谢谢你的文件,它绝对值得一读