2011-10-04 93 views
0

我有一个viewcontroller,进入这个我添加了几个子视图到他的视图,添加数组(数组 - 父视图控制器的属性),并没有发布子视图现在添加,但释放他们dealloc。我对有关内存泄漏的消息感到尴尬。我如何找到解决内存管理问题的方法?谢谢!内存泄漏警告

-(void)someMethod 
{ 
    for(<<something in something>>) 
    { 
      ValidationColumnViewController *controller = [[ValidationColumnViewController alloc] initWithFrame:CGRectMake(columnsInitialX, 5, validationColumnWidth, validationColumnHeight) andValidationColumn:column withMaxCellsCount:maxCellsCountForValidationColumns];    
      [gameFieldView addSubview:controller.view]; 
      [validationColumnViewControllers addObject:controller]; 
    } 
} 
-(void)dealloc 
{ 
    for(ValidationColumnViewController *controller in validationColumnViewControllers) 
    { 
     [controller release]; 
    } 
} 

回答

1

你一定要与线

ValidationColumnViewController *controller = [[ValidationColumnViewController alloc] initWithFrame:CGRectMake(columnsInitialX, 5, validationColumnWidth, validationColumnHeight) andValidationColumn:column withMaxCellsCount:maxCellsCountForValidationColumns]; 

释放您所创建的对象将它们添加到阵列刚过(的ADDOBJECT:调用增加1对象的保留计数),而不是在的dealloc。如果你不这样做,他们可能会在dealloc之前被其他调用从数组中删除,在这种情况下,你会泄漏内存。我认为你也应该在dealloc方法中释放validationColumnViewControllers,因为它显然是一个保留的ivar。

另外添加controller.view对象到另一个视图:

[gameFieldView addSubview:controller.view]; 

是不是一个好主意,这增加了由controller.view 1保留计数而不是控制器保留计数。这意味着控制器可以被释放,但不会导致问题(视图试图与其控制器交谈时的EXEC_BAD_ACCESS)。

而且在

-(void)dealloc 

你应该总是调用[超级的dealloc]在函数的结束,这是究竟是什么导致对象被释放。

+0

so bad :(NSDictionary是什么而不是NSArray? – Arsynth

+0

使用数组没有问题(向字典中添加对象也会增加它的保留数量)只要确保您释放的东西多次保留即可可以打印retainCount(这是一个NSObject属性)来检查(但是,一旦对象被释放,这个值是没有意义的,所以不要使用它,除非它意味着> 0)。 – jbat100

+0

如果你认为'[gameFieldView addSubview:controller。 view];'是一个问题,那么在ValidationColumnViewController中dealloc做'[self。查看removeFromSuperview];'。但我认为这可能不是问题。我的猜测是,当上面的代码所在的类被释放时,gameFieldView将会被释放,并且直到那时ValidationColumnViewControllers才会被保留。 – morningstar

4

在addObject调用后立即释放每个对象。不需要等待dealloc。

+0

我不行。因为它是一些对象的委托(作为赋值属性) – Arsynth

+0

@ user578205收听格雷厄姆。您创建ValidationColumnViewController的每个实例,其保留计数为1.当您将其添加到validationColumnViewControllers时,您会保留该实例,从而导致保留计数为2.您需要在将实例添加到数组以将其保留计数返回后释放该实例它仍然保留;它不会去任何地方。当你拥有的对象被释放时,你的dealloc方法最后会释放它们(尽管我建议释放包含它们的数组而不是循环遍历并单独释放它们)。 – trudyscousin

0

我认为你的代码实际上可以正常工作,但其他答案中的建议是更好的编码实践和风格。你没有得到引用计数你的方式的优势。

编译器无法弄清楚你的代码保证了数组中的对象将被释放。它会寻找简单的模式,例如在创建或保留实例变量并在dealloc中释放它们的范围内释放。如果找不到它们,它会给出警告,但这并不一定意味着你在错误地管理内存,只是编译器无法验证你是否正确地做了这件事。尽管在编译器识别的模式之外做某些事情应该很少是必要的。