1

私はそのようなことをするプログラムを書いています:

- (void)viewDidLoad {
    [super viewDidLoad]; propertyList = [[NSMutableDictionary alloc] init];
    for (SensorData* _data in _res) {
        AttributeLine* newLine=[[AttributeLine alloc] init:idx];
        [propertyList setObject:newLine forKey:[_data textValue]];
        [newLine release];
    }
}

- (void)dealloc {
    [propertyList release];
    [super dealloc];
}

コードは完全ではありませんが、私が行うことの論理があります。問題は、プログラムが[propertyList release]命令に到達したときに、EXEC_BAD_ADDRESSで失敗することです。その命令をコメントすると、すべてうまくいきますが、メモリリークが発生します。何か案が ?

[bbumによる編集:marcoは、彼のdeallocは正しく、コードはまだクラッシュしていると以下に述べています]

4

5 に答える 5

2

-dealloc、あなたはし[super dealloc]ません[super release]。そして、メソッド[super dealloc]の最後の行である必要があります。-dealloc

- (void)dealloc {
    [propertyList release];
    [super dealloc];
}
于 2010-07-22T14:57:39.557 に答える
1

あなたが答えで言ったように(そして私があなたの質問に編集したように)あなたのコードが本当に正しいなら、何か他のことが起こっています。

まず、クラッシュのバックトレースと、クラッシュの前に発生したコンソールメッセージを投稿します。

次に、ゾンビをオンにして(InstrumentsのAllocationsインストゥルメントのゾンビ検出モードを使用)、追加の手がかりが得られるかどうかを確認します。

AttributeLine最後に、のメソッドでクラッシュしている可能性があります-deallocか?辞書の割り当てを解除した結果propertyList、それらのオブジェクトも割り当て解除される可能性があります。

于 2010-07-22T16:14:19.130 に答える
0

[propertyList release]の最初の行に移動してからdealloc、に変更[super release]する必要があり[super dealloc]ます。あなたはスーパーをリリースしたくありません、あなたはそれを呼びたいですdealloc

于 2010-07-22T14:58:46.960 に答える
0

viewDidLoadは複数回呼び出される可能性があるため、ビューコントローラのいずれかinitWithNibName:bundle:または(または両方)でNSMutableDictionaryを初期化することをお勧めします。initWithCoder:2回目に発生すると、リークします。また、deallocメソッドが間違っています。そのはず

-(void) dealloc {
     [propertyList release];
     [super dealloc];
}

EXC_BAD_ADDRESSは、deallocメソッドが正しくないことが原因である可能性があります。

于 2010-07-22T14:59:28.050 に答える
0

私は問題を解決しました:すべてがAttributeLineの-deallocメソッドに接続されています。私のAttributeLineオブジェクトは、3つのラベルで構成されており、前に書いた-dealloc内にあり、これらすべてのラベルについて、-deallocメソッドを呼び出しました。代わりに、私はすべてのラベルにそのリリース方法を要求し、すべてが今うまくいくようです。プログラムの中断やメモリリークはありません!

サポートマンありがとうございます!

于 2010-07-23T08:28:00.093 に答える