Iphone 与内存泄漏相关的UIView

Iphone 与内存泄漏相关的UIView,iphone,objective-c,memory-leaks,Iphone,Objective C,Memory Leaks,我的iPhone应用程序GUI使用了大量UIView。当用户点击按钮前进或后退时,他们会“翻转”这些视图。视图存储在屏幕外,仅当程序需要显示时才添加到实际视图中 在翻转过程中,程序告诉父视图(uiscrollview)使用removeFromSuperView方法删除任何现有的子视图,然后添加新的子视图,即用户应该看到的新页面 然而,在设备上多次重复此过程后,程序崩溃,gdb退出状态为101,我发现这是由内存不足错误引起的 我尝试使用泄漏工具诊断此问题,但没有结果。只有1或2个小内存泄漏,程序在

我的iPhone应用程序GUI使用了大量UIView。当用户点击按钮前进或后退时,他们会“翻转”这些视图。视图存储在屏幕外,仅当程序需要显示时才添加到实际视图中

在翻转过程中,程序告诉父视图(uiscrollview)使用removeFromSuperView方法删除任何现有的子视图,然后添加新的子视图,即用户应该看到的新页面

然而,在设备上多次重复此过程后,程序崩溃,gdb退出状态为101,我发现这是由内存不足错误引起的

我尝试使用泄漏工具诊断此问题,但没有结果。只有1或2个小内存泄漏,程序在设备上的总内存使用量仅为2.5 mb。是否可能是视频内存(而不是系统内存)不足


我看到了一篇关于背景色和mem用法的帖子,但我需要进一步的解释。我是否应该减少背景色设置以防止UIView的CALayer占用太多内存?

您将所有这些视图存储在哪里?具体来说,您是否有一些数组(
NSArray
)在您翻阅它们时具有这些视图


除非这些视图的引用计数为零,否则它们不会被释放。您的“[[UIView alloc]init]使引用计数为1,将其添加为子视图使其为2,将其从子视图中删除使其再次为1。由于没有人告诉您具体的泄漏,因此您似乎并没有像存储在某个位置那样真正泄漏信息。

您将这些视图存储在哪里?具体来说,您是否有一些数组(
NSArray
)在您翻阅它们时具有这些视图


除非这些视图的引用计数为零,否则它们不会被释放。您的“[[UIView alloc]init]使引用计数为1,将其添加为子视图使其为2,将其从子视图中删除使其再次为1。鉴于你没有被告知具体的泄漏,看来你实际上泄漏的并没有存储在某个地方那么多。

你有权访问苹果上的iphone示例代码吗?听起来PageControl示例代码程序是您正在寻找的一个很好的示例。而且示例代码程序没有内存泄漏或任何此类问题:)链接


当您使用仪器时,是否检查了ObjectAllocations?我发现它比leaks工具更有用(不过对象分配是leaks包括的工具之一)。我认为如果视频内存耗尽,那将是另一个错误,但我可能是错的。

您有权访问苹果上的iphone示例代码吗?听起来PageControl示例代码程序是您正在寻找的一个很好的示例。而且示例代码程序没有内存泄漏或任何此类问题:)链接


当您使用仪器时,是否检查了ObjectAllocations?我发现它比leaks工具更有用(不过对象分配是leaks包括的工具之一)。我会认为,如果视频内存耗尽,这将是一个不同的错误,但我可能是错的。

是的,我使用NSArray在屏幕外存储这些视图。总的来说,它们不会占用那么多内存,但是在我定期从主ScrollView添加和删除UIView之后,内存问题就会出现。另一件需要注意的事情是,如果我在2-3个相同的视图实例之间来回翻页,什么都不会发生,一切都正常。但是,如果我向前翻过10个或更多视图,程序就会崩溃。我感觉我几乎已经掌握了这个问题。如果不知道你在做什么,很难说。所以,有两件事:1。添加一些代码,显示您在问题中所做的操作,这样我们可以更好地帮助您。2.我的猜测是,您正在按需向该区域添加视图,并且当您浏览更多“独特”视图(即您以前从未见过的视图)时,您会使用越来越多的内存。尝试以下操作:在调用removeFromSuperview的同一位置,也可以调用
[yourArray removeObject:view]。如果这解决了您的问题,那么我们知道问题是什么,并可以提出一个干净/合适的解决方案。似乎在显示视图后从缓存中删除视图可以防止内存问题的发生。首先,需要注意的是,所有视图都是在任何渲染之前初始化的。但是,尽管在从scrollview中删除视图后,视图被释放,因此不再存在内存问题,但程序不再具有向后翻页的能力。(只能向前翻页)视图组件的实时初始化是这里的最佳选择,还是有替代方案?如果没有代码,几乎不可能说。通常,如果不显示视图,则不应保留视图。相反,请保存足够的状态,以便恢复它们,然后创建一个新视图。因此,如果有人试图从视图X向后翻页,则需要加载视图X-1。最后,为了避免加载次数/闪烁,如果用户希望看到视图X,则应预加载视图X-1和X+1。这样,你总是能看到前方的景色。如果你发布一些你正在做的事情的示例代码,我将能够给出一些更具体的建议。这个建议解决了我的问题。我只是将模型存储在数组中,而不是实际视图中。起初,我认为立即渲染视图的开销太大,但事实并非如此。是的,我使用NSArray在屏幕外存储这些视图。总的来说,它们不会占用那么多内存,但是在我定期从主ScrollView添加和删除UIView之后,内存问题就会出现。另一件需要注意的事情是,如果我在2-3个相同的视图实例之间来回翻页,什么都不会发生,一切都正常。但是,如果我向前翻过10个或更多视图,程序就会崩溃。我感觉我几乎已经掌握了这个问题,很难说不知道