ios - 使用 ARC 进行内存管理

标签 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. 这种将 Controller 添加到某个强变量然后将其 View 添加为 subview 的技术不是呈现另一个 View 的推荐方式。你真的应该使用

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

    [self.navigationController pushViewController:stocksController animated:YES]
    

    (或者,如果您决定按照自己的方式进行操作,则应该执行 View Controller 包含调用,例如 addChildControllerdidMoveToParentViewController)。如果你让你的 View Controller 层次结构与你的 View 层次结构不同步,你最终可能得不到某些事件(特别是旋转事件;关于不小心这样做的问题/风险的冗长讨论,请参阅 WWDC 2011 session - Implementing UIViewController Containment )。此外,如果操作得当,您就不必在 self.stockchartvc 中保留强引用,也根本不需要 closechartdelegate(也不需要可能调用的代码) .

    顺便说一句,如果您采用这些公认的模式之一(模式/推送转换或 View Controller 包含),这可能会解决那里的内存问题。

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

  3. 您不会使用任何重复计时器或任何其他可能导致强引用循环的东西,对吗?例如,我希望 closechartdelegateweak

如果还是不能解决问题,我们可能需要看看stockchartvcclosechartdelegate的内存语义,看看closechartdelegate的代码 正在调用。

关于ios - 使用 ARC 进行内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977617/

相关文章:

ios - 字符串比较(>)在不同平台返回不同结果?

ios - 在 View Controller Xcode 之间滚动

ios - Swift - 通过网络调用和 Storyboard 在 View Controller 中进行依赖注入(inject)?

Xcode 10.3 不适用于 MacOS Big Sur 11.0.1(非测试版)

ios - SWIF 错误消息 : Instantiated view controller . ..但没有获得 UICollectionView。

cocoa-touch - 如何在不连接地址簿的情况下使用 ABPersonViewController

swift - 无法将类型 'AVPlayer' 的值转换为 'Swift.AnyObject.Type'

ios - Xcode:在ARC中编译.c文件?

ios - 在 ARC 系统中使用 openUDID

iphone - iOS5 ARC 如何将 iVar 标记为保留?