1

私のプロジェクトには次のコードがあります。

    RBPPStockChartViewController * stocksController = [[RBPPStockChartViewController alloc] initWithNibName:@"RBPPStockChartViewController" bundle:nil];
    stocksController.companyCode1 = selectedCompany.companycode;
    stocksController.ticker1Text = selectedCompany.ticker;
    stocksController.isMarketIndicator = FALSE;

    if (isfromTVIndexes)
    {
        stocksController.isDJIndexesMenuDisplay = TRUE;
        stocksController.isDJIndexesDirectChartDisplay = FALSE;
    }
    stocksController.closechartdelegate = self;
    self.stockchartvc = stocksController;
    [[self view] addSubview:stocksController.view];// here retain count is incremented.
                                                   // And I am getting leak when I check               
                                                   //with instrument.

ARCを使用しています。この漏れを克服する方法を知りたいです。

4

1 に答える 1

2

いくつかの考え:

  1. コントローラーをいくつかの強力な変数に追加し、そのビューをサブビューとして追加するこの手法は、別のビューを提示するための推奨される方法ではありません。あなたは本当に使うべきです

    [self presentViewController:stocksController animated:YES completion:NULL]
    

    また

    [self.navigationController pushViewController:stocksController animated:YES]
    

    (または、今までの方法で行うことに決めた場合は、 や などのビュー コントローラーの包含呼び出しを行う必要がありますaddChildController) didMoveToParentViewController。ビュー コントローラー階層がビュー階層と同期しなくなると、特定のイベント (特に回転イベント) を取得できなくなる可能性があります。これを慎重に行わないことによる問題/リスクに関する長い議論については、WWDC 2011 セッション - 実装を参照してください。 UIViewController コンテインメント)。また、適切に行った場合は、強い参照を保持する必要self.stockchartvcも、をまったく持つ必要もありませclosechartdelegateん (また、呼び出す可能性のあるコードも)。

    ところで、これらの確立されたパターン (モーダル/プッシュ遷移またはビュー コントローラー コンテインメント) のいずれかを採用すると、メモリの問題が解決される可能性があります。

  2. あるいは、この構造上の問題を解決しない場合は、closechartdelegate呼び出し元のコードを詳しく調べる必要があるかもしれません。つまり、そうremoveFromParentViewですか?それnilstockchartvc変数ですか?これらの両方を行わないと、効果的に漏れます。

  3. 繰り返しタイマーなど、強い参照サイクルをもたらす可能性のあるものは使用していませんか? たとえば、 だと思いclosechartdelegateますweak

stockchartvcそれでも問題を解決できない場合は、、 のメモリ セマンティクスを確認し、が呼び出しclosechartdelegateているコードを確認する必要があります。closechartdelegate

于 2013-06-07T06:47:40.357 に答える