我在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];
答案 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];
从内存中释放/释放视图
记住您alloc
或retain
(还有其他情况,但我忘了他们)你需要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
数组中。
(我只是在猜测。如果我错了,如果您解释了保留这些图像的位置会有所帮助。)