撰写此常见声明时:
UIViewController* viewController = [[UIViewController alloc] initWithNibName:@"myXIB" bundle:nil];
/* do some things with the viewController */
[self.view addSubview:viewController.view];
我想知道这里是否存在可能的内存泄漏,因为:
所以我看到一个内存泄漏,其中viewController永远不会被释放。
你能否告诉我专家的相关知识?
注意:仪器没有发现任何内存泄漏。
答案 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];