Обновление 30/11/2018
Как отметил Дэвид Данхэм в комментариях, документация Apple изменилась (старая ссылка в моем ответе теперь не работает).
Документация Apple теперь гласит:
Эта строка C является указателем на структуру внутри строкового объекта, которая может иметь время жизни короче, чем строковый объект, и, конечно, не будет иметь более длинного времени жизни. Поэтому вам следует скопировать строку C, если она должна храниться вне контекста памяти, в котором вы используете это свойство.
Мой первоначальный ответ теперь неверен в двух частях.
Мое утверждение о том, что строка UTF8 могла бы пережить освобождение NSString
, явно опровергнуто в текущей документации Apple.
В документах Apple «контекст автоматического выпуска» заменен на «контекст памяти». Я не уверен, что именно это означает, но вам, вероятно, не стоит доверять указателю после выхода из области, в которой он был получен.
Оригинальный ответ
Документация Apple (неработающая ссылка) говорит:
Возвращенная строка C автоматически освобождается так же, как возвращаемый объект; вам следует скопировать строку C, если необходимо сохранить ее вне контекста автоматического выпуска, в котором создается строка C.
Мне это кажется довольно неопределенным.
NB. Вы не должны беспокоиться о том, что делает текущая реализация. Изменения реализации
Экстраполируя вышесказанное, ответы на ваши вопросы, вероятно, будут:
но когда он на самом деле освобожден?
Когда пул авто-релиза сливается.
Когда освобождается исходная строка NSString?
Нет. Документация подразумевает, что вы можете выделить строку, взять UTF8String, затем освободить строку, и UTF8String все равно будет действительной , но знать об этой строке из Правила управления памятью :
Полученный объект обычно гарантированно остается действительным в том методе, в котором он был получен ... хотя вы также должны позаботиться о том, чтобы изменить объект, из которого вы получили другой объект.
«Изменение объекта» может включать освобождение строки NSSt, с которой вы получили строку UTF8.
Когда текущий пул автоматического выпуска очищается?
Вот что говорят доктора.
Когда-нибудь еще?
номер
Кроме того, когда он гарантированно останется, в отличие от текущей реализации?
Если это не задокументировано, это не гарантируется.
Если он останется на весь срок жизни строки NSS, будет ли каждый раз возвращаться один и тот же указатель?
Я сомневаюсь в этом. Возможно для неизменяемых строк, строка UTF8 кэшируется, но, возможно, нет. Почему бы не написать некоторый код, чтобы попробовать это? В любом случае, вы не можете полагаться на него в производственном коде или в любой ситуации, когда ваша NSString действительно может быть NSMutableString.