2012-05-17 26 views
1

因此,我已閱讀this問題,這似乎正是我遇到的問題,但該帖子中的答案無法解決我的問題。我正試圖編寫一個數據序列化子類NSMutableData。有問題的函數頭看起來是這樣的:使用ARC的輸出參數

-(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)]; 

就行了,我實際上調用該函數,我得到以下錯誤:

Passing address of non-local object to __autoreleasing parameter for write-back

我試圖放置__autoreleasing前面NSString聲明,在第一個*之前,和兩個*之間,但所有配置都會生成錯誤。

我在閱讀其他問題時是否錯過了某些內容,或者自該帖子發佈以來ARC編譯器中的某些內容發生了更改?

編輯:

看來這個問題是從我試圖訪問字符串的方式到來。我可以解決它通過做這樣的事情:

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

但我寧願要伊娃

+3

您不能直接使用伊娃,因爲分配的值將被自動釋放。 Autorelease對於ivars來說總是一個壞主意,所以ARC允許它。用你的本地變量'temp',ARC將添加所需的保留。 –

回答

1

你不能直接訪問。您可能會從LLVM的文檔Automatic Reference Counting,特別是第4.3.4節獲得見解。 「通過回寫傳遞給出參數」。然而,除了你不能做到的事情外(真的沒有那麼多額外的細節)(具體來說,這不在「法律形式」中列出),你已經知道了。雖然也許你會發現有趣的理由。

+0

嗯,不幸的是,我無法直接訪問這些ivars,我猜想我仍然有點太過於C++程序員的心。那麼,感謝這份文件,這絕對值得一讀 –