0

にオブジェクトを追加するときのメモリ管理に関して問題がありますNSMutableArray。奇妙なことに、最初に追加した 8 つのオブジェクトはすべて正常に動作していますが、9 つ目を追加すると、このオブジェクトを取得するときにアプリケーションがクラッシュします。

UploadStatus *status = [[UploadStatus alloc] initWithStatus:[NSString stringWithFormat:@"%@: %d", NSLocalizedString(@"uploadPictureSucceeded", @""), pic_id] 
                                                 andImageInProgress:nil 
                                                    imageForSuccess:nil 
                                                     imageForFailed:nil];
[self.delegate notify:status];
[status release];

これは、テキストの異なるいくつかの場所で行われています。しかし、このオブジェクトには、UITableView.

デリゲートのメソッドでオブジェクトをnotifyに追加し、その配列内のオブジェクトを表示するをリロードします。UploadStatusNSMutableArrayUITableView

UploadStatusオブジェクトを配列に追加してテーブルをリロードする最初の 8 回は、正しく表示されます。しかし、9回目にエラー[CFString preserve]: message sent to deallocated instance 0x5c655c0 が発生しました。このエラーは、cellForRowAtIndexPathメソッドでテーブルをリロードするときに発生します。

奇妙なことは、このスクリーンショットのように、 内のオブジェクトが範囲外であることを常に示していることです。NSMutableArray

ここに画像の説明を入力

UploadStatusそれにもかかわらず、アイテムをフェッチし、それをクラスに変換してstatusから取得すると、すべてがスムーズに進みます (最初の 8 つのオブジェクトに対して)。

UploadStatusに9番目のオブジェクトを追加した後、なぜうまくいかないのか、誰にも手がかりがありNSMutableArrayますか?

助けてくれてどうもありがとう!

4

2 に答える 2

1

問題は次のコードにあります。

[NSString stringWithFormat:@"%@: %d", NSLocalizedString(@"uploadPictureSucceeded", @""), pic_id]

文字列を保持していないため、実行ループの次の実行時に消えます。最初の 8 個は幸運です。何らかの理由でそれらが上書きされないか、他のオブジェクトがそれらを保持している可能性があります。しかし、9 番目はそうではなく、最終的に間違いの結果が表示されます。

UploadStatus オブジェクトがその文字列を保持する (そして後で解放する) 必要があります。

于 2012-01-28T23:59:18.380 に答える
0

アクセサーを使用するのではなく、このコード ブロックで ivar に直接アクセスしていることに注意してください。これが問題の根本原因であることはほぼ間違いありません (これは、ObjC におけるメモリ管理の問題の第 1 の原因です)。アクセサーに切り替えると、メモリ管理の問題のほとんどが解消されます。

また、先に進んで静的アナライザーを実行する必要があります ([ビルド] > [分析])。光を当てるかもしれません。問題はおそらく上記のコードにはありません。何かを保存している場所です。ほとんどの場合、ivar に保存されています。

于 2012-01-29T00:45:57.837 に答える