UINavigationController:弹出时释放ViewController的内存

时间:2011-10-19 20:29:51

标签: iphone objective-c ios ipad uinavigationcontroller

我在SO上看到了关于这个主题的一些帖子,但没有确切的答案。这是我的问题。

我有UINavigationController我用作图库。在第一个控制器上,我加载了一堆远程图像。这会增加我的内存大小,但不会那么多。单击图像时,它将推送另一个viewController,其中只有单击了图库的图像。这可能会从这些图像中加载另外1MB或更多的数据。

这里的问题是用户可能会浏览任意数量的这些图库。因为当我弹出viewController时,那个内存没有被释放,当用户继续浏览画廊时,我开始在我的应用程序中获得太多内存使用。

当我弹出viewController时,有什么方法可以释放这段记忆吗?也许在我的viewDidDisappear:方法中?如果是这样,我会发布什么?我怎样才能再次创建它?我尝试了这一点,例如发布我的视图,但是我发生了崩溃。

对这个问题的任何见解?

PhotosGalleryiPad *gallery = [[PhotosGalleryiPad alloc] init];
gallery.items = self.items;
gallery.asset = self.currentAsset;
[self.navigationController pushViewController:gallery animated:YES];
[gallery release];

3 个答案:

答案 0 :(得分:0)

如果您正在将视图“弹出”到前景中,请执行以下操作:

infoScreen = [[[infoScreen alloc] initWithNibName:@"InfoScreen" bundle:nil] autorelease];
infoScreen.view.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
[self.view sendSubviewToBack:self.view];

然后你会做[infoScreen release]; 从内存中释放/释放视图 记住您allocretain(还有其他情况,但我忘了他们)你需要release

答案 1 :(得分:0)

您通常会在视图控制器的dealloc方法中释放任何从堆栈中弹出的内存。

但是,如果您正在谈论图像并且使用[UIImage imageNamed:]加载它们,那么UIKit可能正在缓存它们。尝试在模拟器中伪造内存警告(从“硬件”菜单中),看看是否卸载了这些缓存的图像。

您还可以在乐器中进行快照分析。在加载视图控制器之前标记堆,在关闭视图控制器后再次标记它,并查看哪些对象附近。

答案 2 :(得分:0)

你究竟在哪里保留这些画廊图片?

让我猜一下gallery.items是一个包含图像的可变集合(可能是一个数组)。当用户访问新图库时,会向此阵列添加更多图像。从视图控制器到视图控制器,您将传递一个指向此数组的指针:

gallery.items = self.items;

因此,当您弹出视图控制器时,您仍然会使用相同的放大数组。那么,问题是如何在弹出视图控制器时剔除新添加的图像数组。

您可以制作shallow copy of the collection,而不是传递指针。如果它是一个可变数组,你可以这样做:

gallery.items = [self.items mutableCopyWithZone:nil];

然后,当弹出视图控制器时,会释放其items数组。弹出的视图控制器添加的对象将被释放,但旧对象仍保留在先前视图控制器的items数组中。

(我只是在猜测。如果我错了,如果您解释了保留这些图像的位置会有所帮助。)