2016-11-09 3 views
1

Ich habe ein sehr einfaches Projekt: Es gibt nur eine ViewController und eine UIButton. Die IBAction für die Schaltfläche ist:UIAlertController und Speichernutzung

var alertViewControllerTextField: UITextField? 

var promptController = UIAlertController(title: "Type Something", message: nil, preferredStyle: .alert) 

let ok = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in 
       print("\(alertViewControllerTextField?.text)") 
      }) 

let cancel = UIAlertAction(title: "Cancel", style: .cancel) { (action) -> Void in 
       //promptController = nil 
      } 
      promptController.addAction(ok) 
      promptController.addAction(cancel) 
      promptController.addTextField { (textField) -> Void in 
       alertViewControllerTextField = textField 
      } 
      self.present(promptController, animated: true, completion: nil) 

Wenn die App beendet starten, Speichernutzung 14,4 Mb ist.

Wenn ich den Knopf klicke, erreicht er 18,4 Mb (wenn ich immer wieder auf den Knopf klicke, erreicht er schließlich 20 Mb).

Wie auch immer, dachte ich, wenn ich die der UIAlertController geklickt abbrechen oder ok Taste, Speicher zu 14,4 zurückgekehrt wären, wenn auch langsam, aber dies ist nicht der Fall.

Ich dachte, die UIAlertController ein optional haben die Chance, machen es zu einem nil auf nahe zuweisen, aber die UIAlertController nicht nil sein können, weil Sie es als optionales nicht erklären kann. Ich dachte, es zu einem Mitglied zu machen und es mit dem weak Schlüsselwort zu erklären (kein Glück).

Gibt es eine Möglichkeit, die Speichernutzung zu reduzieren, wenn ich auf eine der Schaltflächen eines UIAlertControllers klicke?

+0

Ist das im Simulator oder auf dem Gerät? – jjatie

+0

Es ist im Simulator, habe nicht versucht, Gerät –

+2

Versuchen Sie es auf dem Gerät. Die Speicherbelegung im Simulator bietet keine genaue Darstellung. – jjatie

Antwort

0

Bitte legen Sie DispatchQueue diesen Code als ich versuchen, dieses Problem gelöst, indem dieser

DispatchQueue.global(qos: .userInitiated).async 
{ 
     self.present(promptController, animated: true, completion: nil) 
} 
+0

Nein, es ist das gleiche –

0

ich an anderer Stelle gesehen haben, dass Sie die alertViewControllerTextField schwach erklären müssen, so dass die Maßnahmen, die sie nicht behalten. (Nicht sicher, ob ich diese vollständig noch verstehen.)

So versuchen:

var alertViewControllerTextField: UITextField? 

var promptController = UIAlertController(title: "Type Something", message: nil, preferredStyle: .alert) 

let ok = UIAlertAction(title: "OK", style: .default, handler: { [weak alertViewControllerTextField](action) -> Void in 
       print("\(alertViewControllerTextField?.text)") 
      }) 

let cancel = UIAlertAction(title: "Cancel", style: .cancel) { [weak promptController] (action) -> Void in 
       //promptController = nil 
      } 

promptController.addAction(ok) 
promptController.addAction(cancel) 
promptController.addTextField { (textField) -> Void in 
       alertViewControllerTextField = textField 
      } 
self.present(promptController, animated: true, completion: nil)