2014-09-29 12 views
14

Ho scritto un blocco di codice come il seguente:Come chiamare deinit a Swift

class Person{ 
     let name:String; 
     init(name:String){ 
     self.name = name; 
      println("\(name) is being initialized."); 
    } 

    deinit{ 
     println("\(name) is being deInitialized."); 

    } 
} 

var person:Person?; 
person = Person(name:"leo"); 
person = nil; 

Quando inizializzata, print è ok. Quando si imposta la persona su nil, il metodo deinit non viene chiamato.

+0

Qual è il vero contesto di queste ultime 3 linee? Non possono stare stesi così nella vita reale ... – matt

+0

Bene, questo è il problema allora. – matt

+0

Se stai provando questo in un parco giochi, allora penso che sia il motivo per cui non funziona. Ho appena implementato l'esempio "banca" dal libro Swift e in un parco giochi non viene chiamato il metodo 'deinit', ma se inserisco il codice in un'applicazione e lo eseguo, lo è. – Paulw11

risposta

16

Il problema è che un parco giochi non è la vita reale. Questo è solo un motivo in più per non usarli (penso che siano un terribile errore da parte di Apple). Utilizzare un vero progetto di app per iOS e deinit verrà chiamato come previsto.

esempio da un vero e proprio progetto:

class ViewController: UIViewController { 
    class Person{ 
     let name:String; 
     init(name:String){ 
      self.name = name; 
      println("\(name) is being initialized."); 
     } 
     deinit{ 
      println("\(name) is being deInitialized."); 

     } 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     var person:Person?; 
     person = Person(name:"leo"); 
     person = nil; 
    } 
} 

che fa quello che ci si aspetta che faccia.

+0

ancora "pensi che siano un terribile errore da parte di Apple" – PaulWoodIII

+1

@PaulWoodIII no, ora penso che siano opera del diavolo – matt

+1

punto e virgola (;), è davvero necessario? – turtle

Problemi correlati