Objective c 内存管理、自动释放、永久堆有时为250+;iOS上的kb

Objective c 内存管理、自动释放、永久堆有时为250+;iOS上的kb,objective-c,ios,memory-management,autorelease,Objective C,Ios,Memory Management,Autorelease,我真的很紧张,似乎我在iOS应用程序的内存管理方面遇到了严重的问题 情况是这样的:首先我加载表。当用户点击单元格时,它会显示一个复杂的视图。该视图消耗的内存最多的是加载了500x500的20+UIImages。该视图中还有两个其他选项卡,加载媒体列表(那些UIImages,但随后在一个表中)和另一个简单的表 当我返回到第一个表视图时,显然堆上仍然分配了超过250KB的内存。我知道画面很复杂,但没有理由保留这么多的记忆。好吧,猜猜看,当我频繁切换到视图时,应用程序最终会耗尽内存并被杀死 我试图解决

我真的很紧张,似乎我在iOS应用程序的内存管理方面遇到了严重的问题

情况是这样的:首先我加载表。当用户点击单元格时,它会显示一个复杂的视图。该视图消耗的内存最多的是加载了500x500的20+
UIImage
s。该视图中还有两个其他选项卡,加载媒体列表(那些
UIImage
s,但随后在一个表中)和另一个简单的表

当我返回到第一个表视图时,显然堆上仍然分配了超过250KB的内存。我知道画面很复杂,但没有理由保留这么多的记忆。好吧,猜猜看,当我频繁切换到视图时,应用程序最终会耗尽内存并被杀死

我试图解决的是:

  • 修复所有分析问题,以便不再有泄漏
  • 再次检查所有
    init
    s是否释放,尽可能使用
    autorelease
  • 使用仪器->泄漏检查所有内存泄漏。在6次运行时,我得到的泄漏不超过2或3次
  • 最后,仪器->分配,检查堆。这就是困扰我的地方,在两个标记的堆照片之间,我得到了250+kB的差异。我已经使用详细视图对其进行了研究。我无法理解它:当它指向我的一个方法/类时,我非常确定其中的所有内容都已发布或自动删除。它还指向了很多非我的(比如
    QuartzCore
    )方法/类
另外,我不明白为什么
autorelease
不是autorelease。我的意思是,它有时看起来像是一个标记为自动释放的对象,被释放得太晚了。我自己还没有创建任何
NSAutoreleasePool
s,因此是否可能只有在运行时停止时才排空池?如何定期排水(即使不是我的)

非常感谢您的帮助

亲切问候,

赖德


用于堆检查:

是否使用
imageNamed
加载图像-此方法将所有图像缓存在内存中。请改用
initWithContentsOfFile


但要小心
initWithContentsOfFile:
根本不会缓存,因此如果您对同一个图像多次使用此方法,则应该使用
imageNamed:

我认为您可能需要先尝试优化您的设计,并阅读有效内存管理的指南。更好地了解组件和运行时比跟踪内存分配更有帮助,更容易发现泄漏

  • 首先,您应该始终使用release。仅在必要时使用自动释放
  • 确保遵循UITableView实现和有效管理UITableViewCells(延迟加载、单元重用等)的指导原则
  • 检查是否有保留周期(保留的视图控制器不会被解除分配)
  • 跟踪视图控制器和对象的解除分配
  • 不要把你不再需要的东西放在内存中
  • 现在不要装你不需要的东西

没有,但是谢谢你的回答。所有图像都是从~/Documents加载的,使用
UIImage
的子类,该子类使用
initWithImage
,该子类得到一个
+UIImage图像,其中包含文件的内容。我认为整个问题都是关于这些循环。对象之间的强引用,因此永远不会被释放。我怎样才能避免这种情况?发信人:我很确定这是个好主意。我正在阅读苹果的高级内存管理,我不愿意承认,我已经在类之间建立了引用,比如documentpage和Page Document。谢谢你的建议,回到绘图板;-)。请看:好的,这是结论。子类(如Page)应该对其父类(文档)具有弱引用。父类(文档)应具有对其子类的强引用(第页)。在我的例子中,强引用类似于(非原子的,retain)属性,而弱引用类似于(assign)属性。我一直在使用类似“委托”的对象来通知父对象,使用(非原子,保留)。我认为应该是@property(assign)。对后代:了解您的保留/释放。