iPhone - 包括子视图和可能的内存泄漏?

时间:2011-05-05 09:45:41

标签: iphone memory-leaks uiviewcontroller subview

撰写此常见声明时:

UIViewController* viewController = [[UIViewController alloc] initWithNibName:@"myXIB" bundle:nil];
/* do some things with the viewController */
[self.view addSubview:viewController.view];

我想知道这里是否存在可能的内存泄漏,因为:

  • viewController未按代码
  • 发布
  • 在self.view中插入后调用[viewController release]会使应用程序崩溃
  • view.troller不为self.view所知,因为它不是直接插入的,所以释放self.view不应该释放viewController

所以我看到一个内存泄漏,其中viewController永远不会被释放。

你能否告诉我专家的相关知识?

注意:仪器没有发现任何内存泄漏。

4 个答案:

答案 0 :(得分:1)

如果您希望将视图作为子视图,我认为将视图控制器作为类的实例变量并release将其作为dealloc

更好

<强>更新

取自先前的SO问题

  

仪器的泄漏检测工作原理   保守地扫描记忆,   寻找指针和建立一个   连接图   分配。如果发现任何   指向内存中对象的指针   可以从全局变量到达   或堆栈变量,然后该对象   不能被视为泄露。

     

仪器不知道布局   或指针的上下文。如果你是   到malloc(1024)并且碰巧发生了   是一堆指针   [回收]大块的记忆,那些   即使你永远也不会   把那些指针当作真实的   再次参考。

     

所以,不,泄漏永远不会是100%   准确。同样,还有更多   许多泄漏记忆的方法比   实际泄漏。

答案 1 :(得分:1)

是的,内存会泄漏,你应该总是释放你自己分配的内存。 当您添加[viewController release]时,viewController会立即被释放,然后您的应用程序崩溃,因为它正在尝试访问dealloced内存。要防止它,您应该将viewController包含为类的实例变量。

答案 2 :(得分:0)

这里肯定存在泄漏,因为您分配了一个新的UIViewController但从未发布它(它不会在您进行分配时添加到自动释放池中)。您必须在此viewController对象上保留引用并稍后将其释放。

正如你所说,如果你在[viewController发布]之后立即调用,它会使你的应用程序崩溃,因为你刚刚将其内部视图添加到self.view,但是该视图(viewController)所属的控制器的引用计数器已经没有增加。

答案 3 :(得分:0)

Tableview didselrowatindex方法是发生此类内存泄漏的常见位置。

消除内存泄漏的一种方法是确保只创建一个ViewController实例,然后重复使用它。

此外,这种技术并不仅适用于创建和显示视图控制器,而是适用于任何事物。如果您在代码中创建任何内容,例如uilabels等,请确保您没有创建多个实例。

/ * code * /

// in the interface create an ivar ... or a property if needed
UIViewController *childViewController;

///然后在你的代码中,tableview didSelectRow等

// don't create multiple instances of the VC, rather, check to see if we can reuse one
if (! childViewController)
{
   childViewController = [[UIViewController alloc] init];
}

// do some things with the viewController 
childViewController.someProperty = someValue;
[self.view addSubview:childViewController.view];