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