Вы можете получить ожидаемое поведение, установив OBJC_DISABLE_TAGGED_POINTERS
в YES
в окружение программы. Например, вы можете установить его в вашей схеме в Xcode, как это:
![setting environment variable in scheme](https://i.stack.imgur.com/1kVmh.png)
Что происходит (если вы не установлено, что переменная среды) является среда Objective-C поддерживает маркированные строки указателя , Это означает, что короткие строки общих символов полностью кодируются в 64-битной ссылке на объект, хранящейся в переменной str
. Нет кучного распределения. Поскольку для строки нет кучного распределения, и поскольку строка не может сама иметь ссылки на другие объекты, среда выполнения знает, что на самом деле нет необходимости устанавливать переменную __weak
в значение «0», поэтому она не имеет значения.
Установив эту переменную среды, вы отключите использование всех помеченных указателей, включая помеченные указательные строки. Поэтому я бы не рекомендовал его для производственного кода.
Подробнее о помеченных указателях строк in this excellent article by Mike Ash.
спасибо @rob, теперь я понимаю это, и я хочу знать, почему объект сохранения будет выпущен сразу же, когда он назначен на слабый объект, любой документ на этом? – ximmyxiao
Ознакомьтесь с http://stackoverflow.com/a/9747451/77567 или http://stackoverflow.com/a/36783748/77567 –
Обратите внимание, что если строка является статической (например: @ "xyz"), она может быть расположена в разделе __const, и поэтому операции сохранения/выпуска на нем не являются операциями, точно так же, как тегированные указатели. – russbishop