2014-07-22 5 views
8

Sto rilevando una perdita di memoria quando si utilizza l'interpolazione a stringa con Swift. Usando lo strumento "Perdite", mostra l'oggetto trapelato come "Malloc 32 byte", ma nessuna libreria o frame responsabile. Questo sembra essere causato dall'uso di optionals nell'interpolazione delle stringhe.Perdita di memoria quando si utilizzano le opzioni nell'interpolazione di stringa

Tuttavia, se sostituisco l'interpolazione della stringa con la semplice creazione di una stringa aggiungendo pezzi, nessuna perdita di memoria.

// does not leak 
    var message = "Server created with host: " 
    if self.boundHost 
    { 
     message += self.boundHost! 
    } 
    else 
    { 
     message += "*" 
    } 
    message += " and port: \(self.port)" 
    println(message) 

C'è qualcosa che sto facendo male sopra, o solo un bug Swift?

risposta

7

Rispondendo alla mia domanda ...

Sembra condizionale vincolante è la strada giusta da percorrere quando si utilizza l'interpolazione stringa, invece di usare direttamente gli optionals. Non sono sicuro del motivo per cui il compilatore lo consente.

Nota: se qualcuno ha una risposta migliore o una spiegazione migliore, aggiungere una nuova risposta.

init(boundHost: String?, port: UInt16) 
{ 
    if boundHost { 
     self.boundHost = boundHost! 
    } 
    self.port = port 

    if let constBoundHost = self.boundHost 
    { 
     println("Server created with host: \(constBoundHost) and port: \(self.port).") 
    } 
    else 
    { 
     println("Server created with host: * and port: \(self.port).") 
    } 
} 
+0

Mi sono verificato anche questo problema, perde 32 byte in libswiftcore quando ho chiamato println in un callback delegato. la mia soluzione ha appena aggiunto "!" – PatrickSCLin

+1

Ecco una segnalazione di bug per un problema simile su [bugs.swift.org] (https://bugs.swift.org/browse/SR-1728) se vuoi controllarne lo stato. – user2067021

+0

Indovina questo è quello che avrei dovuto aspettarmi quando usavo un linguaggio di fantasia nuovo di zecca – Sirens