0

インターフェイス部分で宣言された NSString があります。

@property (非アトミック、保持) NSString *filePath;

viewDidLoad でこれに値を指定し、カスタム メソッドの 1 つから呼び出そうとすると、初めて機能しますが、2 番目にクラッシュします。私の意見では、最初の呼び出し時に filePath が自動解放されました。

私は別のアプローチを試みましたが、私の方法では次のようなことをしました:

NSString *path = [[[NSString init] alloc] autorelease]; path = [filePath コピー];

今回はうまくいくようですが、パスのretainCountをチェックすると、常に増加しています。メソッドが初めて呼び出されたとき、retainCount は 4 ですが、2 回目は 2、3 回目は 3 というように続きます。

[copy] が原因で filePath が増加していることは理解していますが、パス変数についてもなぜですか? そして、なぜ最初のケースでうまくいかなかったのですか?

4

1 に答える 1

0

すべてのコードを示しているわけではないので、決定的なことを言うのは難しいです。でも:

NSString *path = [[[NSString init] alloc] autorelease];
path = [filePath copy];

意味がありません: 最初に NSString を割り当て、それをpath指すようにします。次に、パスが別のものを指すようにします。NSString は使用されません (ただし、自動解放によってクリーンアップされます)。

filePathゲッター/セッターではなく、名前だけでアクセスしているようです。self.filePathのように使用する場合

self.filePath = [NSString stringWithFormat:@"..."]; // or any other string

その後、リテイン/リリース ビジネスはセッターによって適切に処理されます。filePath = ...正確には、との違いself.filePath = ...は、後者は割り当てているオブジェクトを保持することです

ココアのフードの下で何が起こっているかを確信していない場合は、retainCount を実際に見てデバッグするべきではありません。

于 2010-08-11T20:51:09.170 に答える