在today widget里使用NSTimer,发生错误警报:error: memory read failed for 0x0
class TodayViewController: UIViewController, NCWidgetProviding {
var timer: NSTimer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view from its nib.
print("widget")
self.preferredContentSize = CGSizeMake(0,100);
timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: Selector(getBattery()), userInfo: nil, repeats: true)
}
func getBattery() {
print("level")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) {
// Perform any setup necessary in order to update the view.
// If an error is encountered, use NCUpdateResult.Failed
// If there's no update required, use NCUpdateResult.NoData
// If there's an update, use NCUpdateResult.NewData
completionHandler(NCUpdateResult.NewData)
}
deinit {
timer.invalidate()
}
}
推測してみましょう:
Deinit は dealloc と同等です。タイマーは、それ自身の循環参照が解放される前に最初に削除され、その後 deinit が呼び出されます。ここで何か問題があるような気がします。適切なタイミングでタイマーを一時停止し、タイマーを nil に設定して、これが機能するかどうかを確認します1. エラー: 0x0 のメモリ読み取りに失敗しました。 0x0 は解放されたオブジェクトです。一般的に、オブジェクトは解放されてから呼び出されるので、エラーが発生します。
2. リーリー
。