使用ARC进行内存管理

时间:2013-06-07 06:26:38

标签: ios xcode automatic-ref-counting

我的项目中有以下代码:

    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。 我想知道如何克服这种泄漏。

1 个答案:

答案 0 :(得分:2)

有几点想法:

  1. 这种将控制器添加到某个强变量然后将其视图添加为子视图的技术不是推荐的另一种视图。你真的应该使用

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

    [self.navigationController pushViewController:stocksController animated:YES]
    

    (或者,如果您决定按照自己的方式执行此操作,则应执行视图控制器包含调用,例如addChildControllerdidMoveToParentViewController)。如果让视图控制器层次结构与视图层次结构不同步,则最终可能无法获取某些事件(特别是轮换事件;有关未仔细执行此操作的问题/风险的冗长讨论,请参阅WWDC 2011 session - Implementing UIViewController Containment )。此外,如果您正确地执行了此操作,则无需在self.stockchartvc中保留强引用,也不必拥有closechartdelegate(也可能是可能调用的代码)。

    顺便说一下,如果你采用这些完善的模式之一(模态/推送转换或视图控制器包含),那可能会解决那里的内存问题。

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

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

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