6

これを少し見ていて、なぜこの単純なコードがエラーを投げているのか理解できませんでした。簡潔にするために短縮:

NSMutableString *output;

...

@property (nonatomic, retain) NSMutableString *output;

...

@synthesize output;

...

// logs "output start" as expected
output = [NSMutableString stringWithCapacity:0];
[output appendString:@"output start"];
NSLog(@"%@", output);

...

// error happens here
// this is later on in a different method
[output appendString:@"doing roll for player"];

誰かが私の間違いを見つけることができますか?

4

2 に答える 2

2

行を変更する

output = [NSMutableString stringWithString:@"output start"]

[self setOutput:[NSMutableString stringWithString:@"output start"]]

(またはself.output = ...、その表記法を好む場合)。

プロパティを宣言しましたが、セッターを使用していないため、文字列を保持していません。

于 2010-04-01T07:34:26.223 に答える
1

user invariantで示されるように、解決策は実際には保持に関係していました。クラスメソッド:

output = [NSMutableString stringWithCapacity:0];

autoreleaseNSMutableString を返します。私の出力プロパティに割り当てられたとき - 一見、retain フラグがあっても - それは保持されませんでした。解決策は、自動解放ではなく自分で割り当てることでした:

output = [[NSMutableString alloc] initWithCapacity:0];

その後、保持が機能しました。理由についての説明は大歓迎です。

編集

理由がわかりました。合成したゲッター/セッターを介してではなく、インスタンス変数に直接アクセスしていました。詳細については、私のブログをご覧ください。

于 2010-04-01T18:40:18.287 に答える