更新状态栏项目图例会导致内存复杂化

时间:2016-05-04 17:46:15

标签: swift macos memory-management

我正在创建一个用于在状态栏上显示CPU温度的应用程序(连续),并且我遇到了内存问题。请考虑以下摘录:

func statusBarInit() {
    statusBarItem = statusBar.statusItemWithLength(NSVariableStatusItemLength)
    statusBarItem.button?.title = "0"
}

// Function called through an NSTimer:
func updateTemperature() {
    var temperature = String(getTemperature())
    statusBarItem.button?.title = "\(temperature)" // Problem
// statusBarItem.button?.title = "Fixed string" // Problem too.
}

我从applicationDidFinishLaunching创建计时器:

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(AppDelegate.updateTemperature), userInfo: nil, repeats: true)

问题在于statusBarItem.button?.title的分配导致内存使用量增加,每分钟300 KB的逐步递增(逐步,不连续),这可以从Activity Monitor仪器和Memory调试窗格中看出。但是,泄漏检测仪器没有检测到任何泄漏。

我可以说这个错误不是由getTemperature()函数引起的,因为如果我用一个固定字符串设置statusBarItem.button?.title(并注释掉getTemperature()的调用),问题仍然存在。没有任何字符串赋值给statusBarItem.button.title,没有问题。

也许定时器频率(100)太快?实际上,温度采样代码在给定的时间段内正常工作。

其他代码如下:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    var statusBar = NSStatusBar.systemStatusBar()
    var statusBarItem : NSStatusItem = NSStatusItem()
    ...
}

0 个答案:

没有答案