Iphone UINavigationController:释放视图控制器';当它弹出时,它的内存会消失

Iphone UINavigationController:释放视图控制器';当它弹出时,它的内存会消失,iphone,objective-c,ios,ipad,uinavigationcontroller,Iphone,Objective C,Ios,Ipad,Uinavigationcontroller,我在这里看到了一些关于这个主题的帖子,但没有明确的答案。这是我的问题 我有一个UINavigationController,用作多媒体资料。在第一个控制器上,我加载了一组远程图像。这会增加我的内存大小,但不会增加那么多。单击图像时,它将推送另一个viewController,其中包含刚刚单击的库的图像。这可能会从这些图像中加载另外1MB或更多的数据 这里的问题是,用户可能浏览任意数量的库。因为当我弹出viewController时,内存没有释放,当用户继续浏览图库时,我的应用程序中的内存使用量开

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

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

这里的问题是,用户可能浏览任意数量的库。因为当我弹出viewController时,内存没有释放,当用户继续浏览图库时,我的应用程序中的内存使用量开始过多

当我弹出我的
viewController
时,是否有任何方法可以释放此内存?也许在我的
视图中:
方法?如果是,我会发布什么?我怎样才能再创造一次呢?我试过这样做,比如释放我的视图,但是我崩溃了

对这个问题有什么见解吗

PhotosGalleryiPad *gallery = [[PhotosGalleryiPad alloc] init];
gallery.items = self.items;
gallery.asset = self.currentAsset;
[self.navigationController pushViewController:gallery animated:YES];
[gallery release];
如果您像这样在前景上“弹出”视图:

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
(还有其他情况,但我马上就忘了)你需要
释放

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

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


您还可以在仪器中进行堆热分析。在加载视图控制器之前标记堆,在关闭视图控制器之后再次标记堆,并查看哪些对象会粘在堆上。

您在哪里保留这些库图像

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

gallery.items = self.items;
因此,当您弹出视图控制器时,仍然会保留相同的放大阵列。然后,问题是如何在弹出视图控制器时剔除这个新添加的图像数组

与其传递指针,还不如创建一个。如果是可变数组,则可以执行以下操作:

gallery.items = [self.items mutableCopyWithZone:nil];
然后,当弹出视图控制器时,其
数组被释放。弹出的视图控制器添加的对象将被释放,但旧对象仍保留在前一个视图控制器的
数组中


(我只是猜测一下。如果我错了,请您解释一下将这些图像保留在何处会有所帮助。)

我了解内存管理规则。我不确定我是否遵循了你的建议。也许我误解了你的问题,我认为你需要帮助从不再使用的ViewController中释放内存。是的,当我将ViewController从堆栈中弹出时,它似乎保留了内存。老实说……听起来内存真的应该卸载了从堆栈中弹出时加载的视图的“dealloc”。是否确定已正确释放dealloc中的所有照片数据?除非您允许用户无休止地在一组视图中向前导航,而无需单击“后退”按钮“按钮…视图导航器中的视图通常应在单击标题中的“后退”按钮时解除锁定。如果是这样的话,那么你可能想看一个不同的导航范例。不,dealloc正在被调用,我的属性正在被发布。他们只需点击,按下控制器,然后点击正常的“后退”按钮,弹出到根目录。不,它不是一个图像数组。它是一个图像URL数组,只是NSString。我需要做一些研究,我有一种感觉,这可能是由我使用的第三方代码引起的。听起来并不是视图控制器保留了图像。如果您在dealloc中适当地释放属性,我认为视图控制器将保留任何内容的唯一方法是通过未被复制的集合。也许如果你看看这些图像是在哪里创建或下载的,你会发现它们背后隐藏着什么。