【发布时间】:2011-05-24 03:16:19
【问题描述】:
运行xcode后->用仪器运行->泄漏, 用细齿梳检查模拟器后,(模拟器)仪器->泄漏显示为零。但是当我运行实际设备时,我会得到一个包含大约 100 多个项目的列表,
Leaked Object # Address Size Responsible Library Responsible Frame
GeneralBlock-64 9 < multiple > 576 UIKit GetContextStack
GeneralBlock-16 7 < multiple > 112 WebCore WebThreadCurrentContext
UIControlTargetAction 5 < multiple > 160 UIKit -[UIControl addTarget:action:forControlEvents:]
__NSArrayM 5 < multiple > 160 UIKit -[UIControl addTarget:action:forControlEvents:]
UIButton 5 < multiple > 720
废话,废话,废话……
我在某处读到有人提到如果您创建任何线程,它们必须在主线程上? (WTF?这没有任何意义)。
是的,我的应用程序使用线程,但仅用于渲染UIAlertViews,它们都夹在[pool autorelease] 和[pool release] 之间,有零个未发布的NSStrings、按钮、小部件。所有被分配、复制、保留、释放的东西。
有谁知道这个线程被池化,导致疯狂的内存泄漏?
提前致谢!
**** 2011 年 5 月 25 日(日本时间上午 11:35)** *********
好的,我想我已经设法确定了我的记忆问题的原因......这是那些 fricken 'AutoRelease UITableViewCells'......他们没有得到及时释放,在他们导致我的应用程序之前崩溃...我只是查看了 AppleTableViewCell API,但没有看到任何关于确定“TV-Cell”是否实际上是“使用中”的信息。因为我的应用程序每页只能容纳 30 个单元格,但这些自动释放单元格会不断增长,直到我收到内存不足警告(124 个电视单元格)。任何人...?知道我怎样才能安全地释放这些......? -
我尝试过使用常规的“Alloc”,并释放直接从 De-queue 中出来的那些,(只是为了让我知道至少有一个很好的数字被释放,但正如预期的那样,它没有像那样..所以我想知道,是否有可能在 ViewDidUnload() for(cells in queue) [release cell] 中执行类似的操作并遍历整个队列,以确保它们都被杀死(当然我不会使用自动发布)任何想法,任何 IOS 大师..?提前谢谢你!-ChinaSailor 40 秒前编辑
【问题讨论】:
-
一个泄漏的对象可能导致许多其他对象被泄漏...
-
您不应该(阅读:不需要)在大多数 Cocoa 代码中使用 NSAutoreleasePools(除非您正在实现异步 NSOperation 或类似性质的东西)。我很想看看您如何在代码中使用 NSAutoreleasePools 的示例。
-
您可能读到的是,您应该只在主线程上更新 UI (UIKit) 元素。
标签: iphone multithreading memory memory-leaks