0

したがって、オブジェクトを別のビューにプッシュした後にオブジェクトを解放する次のコードがあります。分析すると、エラーが発生します-この時点で呼び出し元が所有していないオブジェクトの参照カウントが正しくデクリメントされていません。誰かがこれを修正する方法を知っていますか?異なるメモリリークが発生するたびに、非常に多くのオプションを試しました

- (void)showCurrentArticle:(id)sender {
    if(animating) 
        return; //it is already there
    animating = YES;
    JsonViewController *newsController = [(JsonViewController *)[self.newsNavController.viewControllers objectAtIndex:0]retain];
    newsNavController.title = @"Parliament";
    Item *currentItem = (Item *)[self.fetchedObjectsArray objectAtIndex:currentItemIndex];
    NSString * urlString = [CONST_FEED_DISCRIPTION_URL stringByAppendingString:currentItem.guid];
    [newsController initWithURLString:urlString date:currentItem.date];
    [self.navigationController pushViewController:newsController animated:YES];
    [newsController release];
}
4

4 に答える 4

3

このコードは、ナビゲーションスタックにすでに存在するビューコントローラーを取得し、それを再初期化してから、スタックに再度プッシュします。これはまったく正しくないようです。おそらく、新しいViewControllerを作成する必要があります。これの背景は何ですか?何を達成しようとしていますか?

于 2012-09-03T16:34:27.470 に答える
1

何してるの-initWithURLString:date:?URLを追加するだけですか?次に、それを呼び出す必要がありますaddURL......実際に再度初期化する場合は、newsController変数のポインターを新しいオブジェクトに設定します。それが指し示した最初のオブジェクトは失われます->リーク。

initメソッドに間違った名前を付け、コントローラーにURLを追加したと仮定します。コントローラーは既にスタックにあり、保持数を増やして再度追加しますが、オブジェクトはまったく同じです。

これをしないでください。オブジェクトをコピーするか、それ以上-viewControllerの新しいインスタンスを作成します!!!

于 2012-09-03T18:35:47.090 に答える
1

初期化を行うよりも、ポップしてタイトルを変更しています...

JsonViewController(alloc、init、copyフィールド値)のディープクローンを作成するか、単に参照コピー(保持)を実行するかを決定します。混ぜようとすると、後で混乱します。

于 2012-09-03T16:41:33.073 に答える
1

newsControllerオブジェクトの保持と解放は不要です。そのため、警告が表示されます。newsControllerはnewsNavControllerオブジェクトによって所有されているようです。newsNavControllerオブジェクトはそれを保持します。このコードでnewsControllerを保持する必要がある唯一の理由は、このメソッドの範囲外で使用する必要がある場合です。保持する必要がないので、解放する必要がないため、エラーが発生します。メソッドが保持カウントをインクリメントしていると想定しているかもしれませんが-initWithURLString:date:、これを行うのはnew、alloc、retainだけです。混乱を避けるために、initという用語を使用しないように、おそらくそのメソッドの名前を変更する必要があります。

于 2012-09-03T17:51:16.807 に答える