2016-12-16 6 views
0

этот код получит предупреждение: назначая удерживаемой объект слабого переменного объекта будет выпущен после присвоениякогда будет сохранен объект (который назначается слабым переменным объект) будет выпущен

__weak NSString *str = [[NSString alloc] initWithFormat:@"1234"]; 
NSLog(@"url:%@",str); 

но NSLog напечатает 1234 обычно, кажется, что объект не освобождается после назначения, поэтому когда произойдет релиз?

ответ

2

Вы можете получить ожидаемое поведение, установив OBJC_DISABLE_TAGGED_POINTERS в YES в окружение программы. Например, вы можете установить его в вашей схеме в Xcode, как это:

setting environment variable in scheme

Что происходит (если вы не установлено, что переменная среды) является среда Objective-C поддерживает маркированные строки указателя , Это означает, что короткие строки общих символов полностью кодируются в 64-битной ссылке на объект, хранящейся в переменной str. Нет кучного распределения. Поскольку для строки нет кучного распределения, и поскольку строка не может сама иметь ссылки на другие объекты, среда выполнения знает, что на самом деле нет необходимости устанавливать переменную __weak в значение «0», поэтому она не имеет значения.

Установив эту переменную среды, вы отключите использование всех помеченных указателей, включая помеченные указательные строки. Поэтому я бы не рекомендовал его для производственного кода.

Подробнее о помеченных указателях строк in this excellent article by Mike Ash.

+0

спасибо @rob, теперь я понимаю это, и я хочу знать, почему объект сохранения будет выпущен сразу же, когда он назначен на слабый объект, любой документ на этом? – ximmyxiao

+0

Ознакомьтесь с http://stackoverflow.com/a/9747451/77567 или http://stackoverflow.com/a/36783748/77567 –

+0

Обратите внимание, что если строка является статической (например: @ "xyz"), она может быть расположена в разделе __const, и поэтому операции сохранения/выпуска на нем не являются операциями, точно так же, как тегированные указатели. – russbishop