0

私は特定のプロセスのヒープショットを撮ってきました。すべてのショットでリークされたすべてのオブジェクトは、次の方法で発生します。

- (void)setArticle:(Article *)article
{
    if (_article != article)
    {
        [self.navigationController popToViewController:self animated:YES];

        [_article removeObserver:self forKeyPath:kArticleObservationKey];
        [_article release];
        _article = [article retain];

        [_article addObserver:self forKeyPath:kArticleObservationKey options:NSKeyValueObservingOptionNew context:&__ArticleObservingContext];

        [_article loadIfNeededWithPriority:OGRequestPriorityHigh downloadAllImage:NO];
        [_article fetchRelatedStories];
    }

    [self resetArticleView]; // 65% of heapshot allocations

    if ([_article.isStub boolValue])
    {
        [self.view showSpinner];
    }

    if (_article)
    {
        [Analytics articleReadWithParmeters:[NSDictionary dictionaryWithObject:_article.idOnServer forKey:AnalyticsKeyArticleId]]; // 32% of heapshot allocations
    }
}

これが実際のヒープショットです。これらはすべてこれと同じように見えます。

ヒープショット

いくつか質問があります:

  1. 次のステップは何ですか?この方法ではリークは見られませんが、なぜヒープショットでそれほど目立つようになっているのですか?
  2. [self resetArticleView]隣には65%が少しありますが、その特定のメソッドは、リークされたオブジェクトのスタックトレースのいずれにも表示されません。その特定の65%の指定が何を意味するのか誤解していますか?リークされた割り当ての65%が含まれていることを意味する場合、そのメソッドがスタックトレースに含まれていないのはなぜですか?
4

1 に答える 1

3

割り当てインスツルメントでイベント追跡の保持をオンにして、オブジェクトを保持しているものを確認します。

これもおもしろいと思うでしょう。 リークがリークではないのはいつですか?ヒープショット分析

リークのポイントと割り当てのポイントが同じでない場合があることに注意してください。そのため、現在のバックトレースには表示されないメソッドが表示されます。メソッドが割り当てのソースである可能性がありますが、リーク自体は他の場所での過剰保持が原因です。

(何%を参照しているのかわかりません-そのスクリーンショットを取得しましたか?)

于 2011-07-26T14:48:05.047 に答える