我的项目中有以下代码:
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。 我想知道如何克服这种泄漏。
最佳答案
几个想法:
这种将 Controller 添加到某个强变量然后将其 View 添加为 subview 的技术不是呈现另一个 View 的推荐方式。你真的应该使用
[self presentViewController:stocksController animated:YES completion:NULL]
或
[self.navigationController pushViewController:stocksController animated:YES]
(或者,如果您决定按照自己的方式进行操作,则应该执行 View Controller 包含调用,例如
addChildController
和didMoveToParentViewController
)。如果你让你的 View Controller 层次结构与你的 View 层次结构不同步,你最终可能得不到某些事件(特别是旋转事件;关于不小心这样做的问题/风险的冗长讨论,请参阅 WWDC 2011 session - Implementing UIViewController Containment )。此外,如果操作得当,您就不必在self.stockchartvc
中保留强引用,也根本不需要closechartdelegate
(也不需要可能调用的代码) .顺便说一句,如果您采用这些公认的模式之一(模式/推送转换或 View Controller 包含),这可能会解决那里的内存问题。
或者,如果您不解决这个结构性问题,那么您可能需要仔细查看
closechartdelegate
调用的代码。 IE。它是removeFromParentView
吗?nil
stockchartvc
变量吗?如果你不做这两件事,你就会有效地泄漏。您不会使用任何重复计时器或任何其他可能导致强引用循环的东西,对吗?例如,我希望
closechartdelegate
是weak
。
如果还是不能解决问题,我们可能需要看看stockchartvc
、closechartdelegate
的内存语义,看看closechartdelegate的代码
正在调用。
关于ios - 使用 ARC 进行内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977617/