Maison  >  Questions et réponses  >  le corps du texte

ios - today widget NSTimer memory read error?

在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()
    }
}
PHP中文网PHP中文网2741 Il y a quelques jours628

répondre à tous(1)je répondrai

  • 高洛峰

    高洛峰2017-04-18 09:25:04

    Faisons une supposition :
    1. erreur : échec de la lecture de la mémoire pour 0x0. 0x0 est un objet libéré. ​​L'idée générale est que l'objet est libéré puis appelé, donc une erreur se produit
    deinit {

    .
        timer.invalidate()
    }

    Deinit est équivalent à dealloc. Le timer doit d'abord être supprimé avant que sa propre référence circulaire ne soit libérée, puis deinit est appelé. J'ai l'impression qu'il y a quelque chose qui ne va pas ici. À un moment approprié, mettez le minuteur en pause, puis réglez-le sur zéro. Voyez si cela fonctionne

    .

    répondre
    0
  • Annulerrépondre