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、および 2 つの間に配置しようとしましたが、すべての構成でエラーが発生します。 NSString**

他の質問を読んだときに何かを見逃したのですか、それともその投稿の時からARCコンパイラで何かが変更されましたか?

編集:

文字列にアクセスしようとしている方法に問題があるようです。次のようなことで回避できます。

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

しかし、ivarに直接アクセスしたい

4

1 に答える 1

1

できません。LLVMのドキュメント「自動参照カウント」、特にセクション4.3.4から洞察を得ることができます。「ライトバックによるoutパラメータへの受け渡し」。ただし、実際には、それができないこと(具体的には、これは「法的フォーム」にリストされていない)以外に、それほど詳細な情報はありません。これは、すでに理解していることです。多分あなたは理論的根拠が面白いと思うでしょうが。

于 2012-05-17T20:11:32.277 に答える