【问题标题】:Grand Central Dispatch Growing MemoryGrand Central Dispatch 不断增长的记忆
【发布时间】:2015-07-29 12:19:30
【问题描述】:

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

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

我从我的“协调器”对象调用 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 上进行了一些搜索,但还没有找到任何有用的东西。有人可以指出我正确的方向或指出我明显遗漏的东西吗?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    最好的方法是从 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)
    

    【讨论】:

    • 感谢 sgl0v 我使用了自动释放池,它按建议工作。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2011-07-28
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多