2015-05-04 4 views
20

The Leak è una perdita di root , in questa immagine viene provocata più volte sulla stessa linea, ma c'è un altro sotto che viene chiamato singola ora e produce anche una perdita.Perché c'è una perdita di memoria durante la creazione di stringhe in swift?

enter image description here

Questo è lo stack di chiamate dopo chiamare la riga di codice detto prima.

enter image description here

Questa è la classe dove la perdita si trova da Instruments:

class Item { 
var id: String! 
var name: String! 

internal init(name: String) { 
    self.name = name 
    self.id = name 
} 

var description: String { 
    return "(\(id)) \(name)" 
} 
} 

perdita viene rilevato alla riga di calcolata variabile descrizione contenente return "(\(id)) \(name)" e diventa risolto dopo la modifica descrizione in:

var description: String { 
    return "(" + id + ") " + name 
} 
.210

Aggiornamento:

o

var description: String { 
    if let id = self.id as? String, let name = self.name as? String { 
     return "(\(id)) \(name)" 
    } 
    return "NO AVAILABLE DESCRIPTION" 
} 

L'ultimo emette un "getto condizionale da 'String!' a String ha sempre successo ".

Quindi, anche questo sembra un trucco.

Perché questo causa una perdita?

+0

È probabile che qualcosa fuori da questa classe causi la perdita. Controlla la classe che crea questo oggetto Item. Sta referenziando id o nome? Inoltre, la perdita è un "ciclo" Ciò indica anche che qualcosa al di fuori di questa classe contiene un riferimento – Stephen

+0

@Stephen Ho aggiornato la domanda, aggiungendo alcune informazioni sulla perdita –

+0

Entrambe le forme della concatenazione di stringhe devono essere valido Sembra che questo potrebbe essere un bug di Apple. Potresti provare a presentare una segnalazione di bug con Apple. – Stephen

risposta

7

Ho testato il codice e sono passato attraverso alcuni thread e la mia comprensione è che si deve legare facoltativo clausola if let, quando si utilizza l'interpolazione di stringa invece di utilizzare direttamente variabili opzionali. Per la concatenazione di stringhe, se usiamo gli optionals direttamente non ci sono problemi. Il problema è con l'interpolazione.

È possibile ottenere maggiori informazioni qui memory leak in Swift String interpolation. Sembra un bug e potrebbe essere rilasciato in futuro, sarà risolto.

+0

Questa perdita di memoria, in caso di interpolazione, sta accadendo per me se sto usando più di una variabile opzionale, con una che funziona bene. – Amit89

+0

Ho provato il tuo codice, e anche quando le mie variabili di classe 'id' e' name' sono 'String!' E Xcode afferma che "Cast condizionale da 'String!' to String riesce sempre "compila e smette di lanciare una tale perdita. –

+0

Ho provato qui, sto ottenendo anche la stessa cosa. – Amit89

1

In realtà preferisco la soluzione che Hugo ha pubblicato insieme alla sua domanda perché il codice sembra più pulito. Dopo la profilatura il mio codice, ho anche scoperto che la mia perdita di memoria è stato risolto dopo l'utilizzo di concatenazione di stringhe:

var description: String { 
    return "(" + id + ") " + name 
} 

Per quel che vale, questo post (http://www.globalnerdy.com/2016/02/03/concatenating-strings-in-swift-which-way-is-faster/) dice anche che l'uso di concatenazione di stringhe a Swift è significativamente più veloce.