Почему происходит быстрое утечка памяти при создании строки?
Утечка Root Leak. В этом изображении несколько раз вызывается в одной строке, но есть еще одно ниже, которое называется одноразовым, а также вызывает утечку.
![enter image description here]()
Это стек вызовов после вызова строки кода, указанной ранее.
![enter image description here]()
Это класс, где утечка находится на инструментах:
class Item {
var id: String!
var name: String!
internal init(name: String) {
self.name = name
self.id = name
}
var description: String {
return "(\(id)) \(name)"
}
}
Утечка обнаруживается в строке вычисленной переменной description, содержащей return "(\(id)) \(name)"
, и она решается после изменения описания на:
var description: String {
return "(" + id + ") " + name
}
Update:
или
var description: String {
if let id = self.id as? String, let name = self.name as? String {
return "(\(id)) \(name)"
}
return "NO AVAILABLE DESCRIPTION"
}
Последний издает "Условный отбор из" Строка! "для String всегда удается".
Итак, даже это выглядит как хак.
Почему это вызывает утечку?
Ответы
Ответ 1
Я протестировал ваш код и просмотрел несколько потоков, и я понимаю, что при использовании строковой интерполяции вместо опциональных переменных вы должны иметь необязательную привязку if let
. Для конкатенации строк, если мы используем опциональные элементы напрямую, проблем нет. Проблема заключается в интерполяции.
var description: String {
if let id = self.id, let name = self.name {
return "(\(id)) \(name)"
}
return "NO AVAILABLE DESCRIPTION"
}
Вы можете получить дополнительную информацию здесь утечка памяти в интерполяции Swift String.
Похоже на ошибку и может быть в будущем выпуске, она будет решена.
Ответ 2
Я действительно предпочитаю решение, которое Hugo отправил вместе с его вопросом, потому что код выглядит чище. После профилирования моего собственного кода я также обнаружил, что утечка памяти была решена после использования конкатенации строк:
var description: String {
return "(" + id + ") " + name
}
Для чего это стоит, этот пост (http://www.globalnerdy.com/2016/02/03/concatenating-strings-in-swift-which-way-is-faster/) также говорит о том, что использование конкатенации строк в Swift значительно быстрее.