2

iOS静的ライブラリでメモリリークを引き起こしているコードがいくつかあります。Instrumentsからのオブジェクトの存続期間は次のとおりです。

# Category Event Type Timestamp RefCt Address Size Responsible    Library Responsible Caller
0 Table_ColumnListener Malloc 4712087040 1 0x5e5fe60 16 Tests -[Table _initWithRows:andColumns:andTupleType:]
1 Table_ColumnListener Retain 4712301056 2 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
2 Table_ColumnListener Retain 4712453120 3 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
3 Table_ColumnListener Retain 4712602112 4 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
4 Table_ColumnListener Retain 4712755968 5 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
5 Table_ColumnListener Retain 4712915968 6 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
6 Table_ColumnListener Retain 4713062144 7 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
7 Table_ColumnListener Retain 4729644288 8 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
      /\
 This is what confuses me
8 Table_ColumnListener Release 4729646080 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
9 Table_ColumnListener Release 4729647872 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
10 Table_ColumnListener Retain 4729679104 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
11 Table_ColumnListener Release 4729680896 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
12 Table_ColumnListener Release 4729682944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
13 Table_ColumnListener Retain 4729713152 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
14 Table_ColumnListener Release 4729714944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
15 Table_ColumnListener Release 4729717248 4 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
16 Table_ColumnListener Release 4729731840 3 0x5e5fe60 0 Tests -[Table dealloc]

これがのコードです[AbstractColumn addColumnListener:]

-(void) addColumnListener:(id <ColumnListener>)listener
{
 [m_listeners addObject:listener];
}

そしてのために[AbstractColumn removeColumnListener:]

-(void) removeColumnListener:(id <ColumnListener>)listener
{
 [m_listeners removeObject:listener];
}

からオブジェクトを削除すると、オブジェクトをデクリメントするのではなく、保持カウントを増やすNSMutableArrayように見えます。他の誰かがこの問題を抱えていて、解決策を知っていますか?

4

1 に答える 1

2

あなたが観測しているものをInstrumentsで再現することができます。NSMutableArrayは、オブジェクトを破棄する前に、オブジェクトを保持し、魔法をかけてから解放します。このリリースは、以前の保持を打ち消し、少し後で発生することとは何の関係もありません。今回も、オブジェクトが配列から削除されたため、リリースです。

配列の内部実装が行っていることは、まったく関係ありません。オブジェクトを必要なだけ保持/解放できます。重要なのは、オブジェクトが削除されたときにそれを期待するため、保持よりももう一度リリースを呼び出すことです。したがって、あなたが観察すること

retain
release
release

問題はなく、メモリリークはまったくありません。removeObject:の内部実装でコードを実行している間、retainCountが上昇する可能性がありますが、メソッドが戻るとすぐに、カウントは実際には減少します。

于 2010-11-08T13:15:05.613 に答える