使用ARC的输出参数

时间:2012-05-17 18:10:01

标签: ios automatic-ref-counting

所以我已经阅读了this问题,这似乎正是我遇到的那种问题,但该帖子中的答案并没有解决我的问题。我正在尝试编写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

1 个答案:

答案 0 :(得分:1)

你做不到。您可以从LLVM的文档Automatic Reference Counting中获得见解,特别是第4.3.4节。 “通过回写传递出参数”。但是,除了你不能做到这一点之外,确实没有那么多额外的细节(具体来说,这没有在“法律形式”中列出),你已经想到了。虽然也许你会发现有趣的理由。