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]
    

    (或者,如果您决定按照自己的方式进行操作,则应该执行视图控制器包含调用,例如addChildControllerand didMoveToParentViewController)。如果您让视图控制器层次结构与视图层次结构不同步,您最终可能不会收到某些事件(尤其是旋转事件;有关不仔细执行此操作的问题/风险的冗长讨论,请参阅WWDC 2011 session - Implementation UIViewController 包含)。此外,如果你做得正确,你就不必保留你的强引用,self.stockchartvc也不需要 a closechartdelegate(也没有可能调用的代码)。

    顺便说一句,如果您采用其中一种成熟的模式(模态/推送转换或视图控制器包含),则可能会解决那里的内存问题。

  2. 或者,如果您不解决此结构性问题,那么您可能需要仔细查看closechartdelegate调用的代码。即它removeFromParentView吗?它nilstockchartvc变量吗?如果你不做这两件事,你就会有效地泄漏。

  3. 您不使用任何重复计时器或任何其他可能导致强参考周期的东西,是吗?例如,我希望closechartdelegateweak.

如果仍然无法解决问题,我们可能需要查看 , 的内存语义stockchartvcclosechartdelegate并查看closechartdelegate调用的代码。

于 2013-06-07T06:47:40.357 回答