什么时候应该释放内存?

时间:2011-05-22 21:50:53

标签: objective-c ios uiview uiwebview memory-management

我已经阅读了所有iOS内存分配/解除分配基础知识,但在以下内容中找不到任何内容:

我创建了一个小应用程序,它几乎列出了UIButtons的网格,并点击其中的任何一个,它将UIScrollView添加到当前控制器视图(并在内部添加了一堆UIView和UIWebView)。

在添加UIScrollVIew时,我还添加了一个UIButton,它将我带回“home grid”,然后从superview中删除UIScrollView。 我发布了所有我保留/分配等的东西,当我用仪器检查应用程序时,它没有显示任何内存泄漏。

但是每次点击任何UIButton对象时,我都会分配更多内存(根据Instruments)并且它会不断增长 - 并且从按钮“重新打开”相同类型的UIScrollView总是会增加更多的内存分配。

如果我在模拟器中模拟内存警告,它会释放一些内存,然后我可以继续增长它。

所以这是我的问题:我是否应该尝试以某种方式手动解除分配?如果是这样,我应该在哪里实际做到这一点?我对Obj-C很新,所以我认为我已经掌握了大部分基础知识,但更高级的主题仍需要一些帮助。

创建网格:

UIScrollView *grid = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
[[self view] addSubview:grid];
[grid release];

添加按钮(在for循环中):

UIButton *slotItem = [[UIButton alloc] initWithFrame:CGRectMake(((float) slotWidth * j), ((float) slotHeight * i), (float) slotWidth, (float)slotHeight)];
[grid addSubview:slotItem];

UIWebView *buttonWebThumb = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, slotWidth, slotHeight)];

[buttonWebThumb setBackgroundColor:[UIColor clearColor]];
[buttonWebThumb setOpaque:NO];

[buttonWebThumb loadHTMLString:[NSString stringWithFormat:@"%@ %@ %@", htmlTop, [[row objectAtIndex:j] objectAtIndex:1], htmlBottom] baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
buttonWebThumb.scalesPageToFit = YES;
[slotItem addSubview:buttonWebThumb];
buttonWebThumb.userInteractionEnabled = NO;
buttonWebThumb.exclusiveTouch = NO;
[buttonWebThumb release];

[slotItem addTarget:self action:@selector(showPages:) forControlEvents:UIControlEventTouchUpInside];

[slotItem release];

showPages方法然后创建另一个UIScrollView并在其中添加1-10个单独的UIWebView,并为新的UIScrollView添加一个“关闭”按钮。

2 个答案:

答案 0 :(得分:2)

通过release方法间接调用Dealloc,你永远不应该直接调用它。NSObject Manual on dealloc

答案 1 :(得分:2)

您可能会看到这一点,因为您在离开之前未从视图中删除所有元素。

例如,如果使用这样的方法退出视图,请执行以下操作:

- (id) viewExitAction: (id) sender {
  id elem;
  for(elem in buttons) {
    [elem removeSelfFromView];
  }
  // etc
}

这会自动将这些对象的保留计数减少到零。 (如果你将它们添加到视图中,然后按照你的意愿释放它们。)

否则,viewDidUnloaddealloc方法永远不会被调用。

相关问题