swift - Grand Central Dispute 增长内存

标签 swift cocoa memory-leaks grand-central-dispatch

概述:我正在创建一个 Swift 程序,该程序下载更新非常频繁(可能每秒几次)的实时 JSON 数据,然后在 tableView 中将其显示给用户。当程序开始时,它使用 GCD 在单独的线程中进行下载,本质上是在程序运行的整个过程中运行该线程。

问题:程序可以很好地下载并显示数据,但我注意到程序的内存(如 Xcode 调试导航器中所示)的增长速度远远快于 JSON 数据的传入速度。几分钟之内,它就达到了几百 MB .

我从“Coordinator”对象调用dispatch_async,该对象还存储我正在更新的实例变量的集合。这是我的代码

func startDownload() {

   dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
      while (true) {
         self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
         dispatch_sync(dispatch_get_main_queue(), {
            self.referenceToViewController!.reloadUpComingMarketsTableView()
            self.referenceToViewController!.reloadMainTableView()
        })
      }
   } ) // end of dispatch_async

   // end of start()
}

我是 GCD 新手,在 stackoverflow 上做了一些搜索,但还没有找到任何有用的东西。有人可以指出我正确的方向或指出我明显遗漏的东西吗?

提前致谢!

最佳答案

最好的方法是从 Xcode 分析内存报告或通过 Instruments 获取更详细的信息。

我建议您使用自动释放池(强制释放所有自动释放的对象):

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
      while (true) {
        autoreleasepool {
             self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
             dispatch_sync(dispatch_get_main_queue(), {
                self.referenceToViewController!.reloadUpComingMarketsTableView()
                self.referenceToViewController!.reloadMainTableView()
            })
        }
      }
   } ) 

或者通过GCD定时器下载数据:

let interval = 5.0 // seconds
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC) / 10)
dispatch_source_set_event_handler(timer, {
    self.myDataPipe.downloadMarketOdds(self.marketsToUpdate)
    dispatch_sync(dispatch_get_main_queue(), {
        self.referenceToViewController!.reloadUpComingMarketsTableView()
        self.referenceToViewController!.reloadMainTableView()
    })
})
dispatch_resume(timer)

关于swift - Grand Central Dispute 增长内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700231/

相关文章:

ios - 在文本中显示从文件路径查看 .log 文件

cocoa - NSTextField:如何像在其他应用程序中一样添加搜索图标?

javascript - 如果不在 switch case 中声明 block 范围,是否会导致内存泄漏? (ESLint 无案例声明)

swift - 访问菜单项以禁用/启用

ios - 离散余弦变换的不同结果和代码......这是怎么回事?

objective-c - iPhone 上 UILabel 中的格式化文本

objective-c - OCUnit 测试嵌入式框架

Delphi 7、DUnit 和 FastMM 错误地报告字符串

java - 使用自动装箱的内存泄漏

ios - 如何让我的 Swift 类实时更新 View Controller 中的标签?