Подстрока строки повторно использует хранилище исходной строки? - PullRequest
0 голосов
/ 28 октября 2018

Я просматривал раздел «Строки и символы» swift docs

Здесь упоминается:

подстроки не подходят для длинныхтермин хранение - поскольку они повторно используют хранение исходной строки, вся исходная строка должна храниться в памяти до тех пор, пока используется любая из ее подстрок.

Я пытался проверить это на игровой площадке, ното, что произошло, похоже, отличается от того, что упомянуто выше.Я запустил следующий код на детской площадке:

var greeting : String? = "Hello, world!"
let index = greeting!.firstIndex(of: ",") ?? greeting!.endIndex
let beginning = greeting?[..<index]
print(beginning ?? "")
greeting = nil
print(beginning ?? "")

То, что я ожидал напечатать:

"Hello"
""

Но что именно было напечатано:

"Hello"
"Hello"

Следуетустановка исходной строки на ноль также привела к удалению подстроки?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Как уже говорили другие, ваш тест подтверждает проблему, которую вы цитировали: сохранение подстроки сохраняет строгую ссылку на исходную строку, поэтому она не освобождается.

Представьте, что исходная строка была всем текстомиз "Войны и мира", и вы получили подстроку, содержащую первое вхождение "и".Весь текст «Войны и мира» останется в памяти до тех пор, пока вы сохраните эту подстроку.

Вы можете избежать строгой ссылки, преобразовав подстроку в обычную строку:

let beginning = String(greeting?[..<index])
0 голосов
/ 28 октября 2018

Поведение правильное.

Подстрока разделяет счетчик ссылок исходной строки. Если исходная строка уничтожена, ссылка все еще жива.

Пожалуйста, смотрите WWDC 2017: что нового в Swift с 36:00

И фактически даже цитируемый текст подтверждает это поведение, потому что говорит, что после нарезки строки вся строка сохраняется в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...