3

作成中のアプリケーションでデバッグを行っていましたが、計測器を実行すると、理解できないメモリ リークが見つかりました。

Instruments の提案に従ってコードを変更しようとすると、アプリケーションがクラッシュします。

割り当て解除されたインスタンスに送信されたメッセージ

誰かが私を助けることができますか?

- (void) objectAtIndex:(int)index {
    SpecialObject *specialObj = [SpecialObject sharedInstance];

    id model = [self.datasource objectAtIndex:index];

    if ([model isKindOfClass:[ClassA class]]) {
        ClassA *objA = (ClassA *)model;
        specialObj.title = objA.title;

    } else if ([model isKindOfClass:[ClassB class]]) {
        ClassB *objB = (ClassB *)model;
        specialObj.title = objB.title;
    }
}

self.datasourceNSMutableArrayしばらくの間specialObj.titleですNSString

それらは次のように定義され@property(nonatomic, retain)ます。

私の問題は、インスツルメンツがこれらの2つを教えてくれることです

ClassA *objA = (ClassA *)model;
ClassB *objB = (ClassB *)model;

リークですが、リリースするobjAobjBアプリケーションがクラッシュします。

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

4

3 に答える 3

0

私の推測では、データソースを解放することは決してありません。ARCを使用していないと仮定すると、deallocメソッドでは、

[self setDataSource: nil];

また

[instanceVariableThatBacksDataSourceProperty release];

多くの人が前者を行いますが、Appleは、割り当て解除中にKVOがトリガーされないように、後者を推奨しています。

于 2012-05-23T15:42:49.230 に答える
0

いくつかの検索の結果、問題が見つかりました。XCodeは通常、リークがどこにあるかを示しますが、場合によっては、その可能性のある位置を示します。

これは、メモリリークがプログラムフローのどこかにあることを意味し、XCodeが示すポイントに到達しますが、必ずしも正確に言う場所ではありません。

これが将来誰か他の人を助けることができることを願っています!

于 2012-11-09T11:17:16.330 に答える
0

リークとあなたの例外は別のものです。例外は、リリースしてはならないものをリリースすることによってほぼ確実に発生します。

両方を持っているという事実は、Objective-C のメモリ管理についての理解が十分でないことを示唆しています。

最初に例外を理解することに集中する必要があります。そのための最初のステップは、例外 tracebackを確認することです。

于 2012-05-23T15:47:28.987 に答える