Каков гарантируемый жизненный цикл - [NSString UTF8String]?

В документах неопределенно говорится, что это будет слоняться поблизости как долго по мере необходимости, но когда это будет на самом деле освобождено? Когда исходный NSString освобожден? Когда текущий пул автовыпуска очищается? Когда-то еще? Кроме того, когда это, как гарантируют, останется для, в противоположность текущей реализации? Если это останется в течение времени жизни NSString, то тот же указатель будет возвращен каждый раз?

Спасибо

5
задан Jared Pochtar 19 June 2010 в 04:27
поделиться

2 ответа

Обновление 30/11/2018

Как отметил Дэвид Данхэм в комментариях, документация Apple изменилась (старая ссылка в моем ответе теперь не работает).

В документации Apple теперь говорится:

Эта строка C является указателем на структуру внутри строкового объекта, время жизни которого может быть короче, чем у строкового объекта, и определенно не будет иметь более продолжительного времени жизни. . Следовательно, вы должны скопировать строку C, если она должна храниться вне контекста памяти, в котором вы используете это свойство.

Мой первоначальный ответ состоит из двух частей.

Мое заявление о том, что строка UTF8 могла выжить после освобождения NSString , прямо опровергается текущей документацией Apple.

В документации Apple «контекст автозапуска» был заменен на «контекст памяти». Я не уверен, что именно это означает, но вам, вероятно, не следует доверять указателю после того, как вы вышли из области, в которой он был получен.

Исходный ответ

В документации Apple (неработающая ссылка) говорится:

Возвращенная строка C автоматически освобождается, как только будет освобожден возвращенный объект; вам следует скопировать строку C, если необходимо сохранить ее вне контекста автозапуска, в котором создается строка C.

Мне это кажется довольно непонятным.

NB. Вам не стоит особо беспокоиться о том, что делает текущая реализация. Изменения в реализациях

Если экстраполировать вышеизложенное, ответы на ваши вопросы, вероятно, будут такими:

но когда это фактически освобождается?

Когда пул с автозапуском опорожняется.

Когда освобождается исходный NSString?

Нет.Документация подразумевает, что вы можете выделить строку, взять UTF8String, затем освободить строку, и UTF8String все равно будет действительным , но помните об этой строке из Правил управления памятью :

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

«Изменение объекта» может включать освобождение NSString, из которого вы получили строку UTF8.

Когда очищается текущий пул автозапуска?

Так говорят документы.

Когда-нибудь еще?

Нет.

Кроме того, когда это гарантированно останется, в отличие от текущей реализации?

Если это не задокументировано, это не гарантируется.

Если он остается на время существования NSString, будет ли каждый раз возвращаться один и тот же указатель?

Я сомневаюсь в этом. Возможно, для неизменяемых строк строка UTF8 кешируется, а может и нет. Почему бы не написать код, чтобы попробовать? В любом случае вы не можете полагаться на него ни в производственном коде, ни в любой ситуации, когда ваш NSString действительно может быть NSMutableString.

5
ответ дан 14 December 2019 в 18:58
поделиться

Обычно это происходит, когда NSAutoreleasePool получает сообщение -drain , при условии отсутствия устаревших ссылок .

Изменить: Ссылка на «правила»

0
ответ дан 14 December 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: