2011-08-15 111 views
0

所以我有问题释放一些视图控制器。 从本质上来说,PhotoPostViewController的dealloc似乎永远不会被调用,所以我无法清除包含在其中的图像正在咀嚼所有的内存。为什么我的UIViewController不能正确释放?

这是我的UIViewController子类,我可以在任何时候将其中的100个添加为主滚动视图的子视图,之后iPad会紧张记忆。

@interface PhotoPostViewController : UIViewController { 
    IBOutlet UIImageView *backgroundImage; 
    IBOutlet UIImageView *serviceImage; 
} 

然后在我的主视图类我要创建这些意见,并把它们添加到一个滚动视图的方法。通常从循环中调用此方法以创建所需的所有子视图。

- (void) addPost { 
    PhotoPostViewController *postView = [[PhotoPostViewController alloc] initWithNibName:@"PhotoPostViewController" bundle:nil]; 
    [scrollView addSubview:[postView view]]; 
    [viewControllers addObject:postView]; 
} 

viewControllers是在主类init中创建的NSMutableArray。 scrollView是我主视图上的UIScrollView。

这一切工作正常,我知道在iPad上的内存使用限制,并保持在任何给定的时间内,打开弹出窗口给预览图像和视频等...... 不会耗尽内存我尝试刷新屏幕。 做到这一点的代码是:

- (IBAction)didPressRefresh:(id)sender { 
    for(UIView *subview in [scrollView subviews]) { 
     [subview removeFromSuperview]; 
    } 
    for(UIViewController *c in viewControllers) { 
     [c release]; 
    } 
    [viewControllers removeAllObjects]; 
} 

为了简单起见我清偿所有子视图,并尝试重新创建下一组用上面的功能子视图之前将他们释放的缘故。 它从视图中删除它们,但添加了一组新的视图控制器。在我的测试用例中,视图控制器的内容在内容上是相同的,所以如果它从干净的第一次加载,那么如果我正确地释放所有内容,它应该在第二次和其他时间加载。

实际发生的事情是由于创建第二组视图控制器时内存不足导致崩溃。

在调试过程中,我在'viewDidUnload'和'dealloc'方法上放置了断点,但它们永远不会被击中。

它看起来像UIViewController本身获得释放,但UIImageViews不是,显然他们通常会被我的代码在dealloc(或viewDidUnload)方法中释放。

所以我很困惑。 计算它看起来像我的引用计数很好。那么dealloc怎么没有被击中?

安迪

回答

2

你需要将它添加到viewControllers收集之后发送postView对象-release消息:

- (void) addPost { 
    PhotoPostViewController *postView = [[PhotoPostViewController alloc] initWithNibName:@"PhotoPostViewController" bundle:nil]; 
    [scrollView addSubview:[postView view]]; 
    [viewControllers addObject:postView]; 
    [postView release]; 
} 

为什么你需要做的,这是因为集合发送-retain消息的原因添加到它的所有对象,因此内存泄漏和-dealloc不被击中。

编辑:

-didPressRefresh:方法应该是这样的:

- (IBAction)didPressRefresh:(id)sender { 
    [[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];  
    [viewControllers removeAllObjects]; 
} 
+0

其实我试过了,但随后在didPressRefresh释放造成的一个问题...所以我删除了,是返回与dealloc没有再次击中:/ 顺便说一句removeAllObjects不减少保留计数? –

+0

@Eva是的,'-removeAllObjects'应该减少集合中所有对象的引用计数。 –

+0

在这种情况下,我将alloc和addObject计数为递增计数,[c release]和removeAllObjects递减计数,2代表2,它应该被释放,而不需要您建议添加的版本的neeed ... 我假设[c版本]和[postView版本]由于继承调用相同的代码,但也许他们不,并且[c版本]只调用UIViewController dealloc,而不是PhotoPostViewController dealloc? –

相关问题