Подтвердить что ты не робот

Почему происходит быстрое утечка памяти при создании строки?

Утечка 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 всегда удается".

Итак, даже это выглядит как хак.

Почему это вызывает утечку?

4b9b3361

Ответ 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 значительно быстрее.