我已经阅读了所有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添加一个“关闭”按钮。
答案 0 :(得分:2)
通过release方法间接调用Dealloc,你永远不应该直接调用它。NSObject Manual on dealloc
答案 1 :(得分:2)
您可能会看到这一点,因为您在离开之前未从视图中删除所有元素。
例如,如果使用这样的方法退出视图,请执行以下操作:
- (id) viewExitAction: (id) sender {
id elem;
for(elem in buttons) {
[elem removeSelfFromView];
}
// etc
}
这会自动将这些对象的保留计数减少到零。 (如果你将它们添加到视图中,然后按照你的意愿释放它们。)
否则,viewDidUnload
和dealloc
方法永远不会被调用。