Розетки как слабые прекрасны, пока они находятся на экране в качестве подзонов. на самом деле они будут сохранены массивом subviews
их супервизора. Как только они будут удалены с экрана (поэтому из массива subviews
), retainCount
уменьшит его. Если только сильная ссылка на выход находится в массиве subviews
(случай слабого свойства), то retainCount
будет равен нулю, объект будет освобожден, а ваше имущество testButton
станет нулевым. В этом случае вы никогда не сможете повторно использовать свой testButton
свойство, так как оно принудительно распаковано, и любой доступ приведет к сбою. Если вид может быть удален с экрана программно, может быть хорошей идеей установить это свойство как ?
необязательно.
Вы хотите, чтобы это свойство получило прочную ссылку на розетку, если вы хотите программно удалить эту розетку с экрана и последовательно добавлять ее в качестве подвидного программного обеспечения на основе некоторой логики взаимодействия с пользователем. В этом случае, имея сильную ссылку, метод removeFromSuperView уменьшит количество удержаний, которое будет по-прежнему равно 1, поскольку ваше свойство сохраняет объект.
Если вы установили нулевую ссылку, и объект больше не является подзаголовком, то он будет освобожден, и вы не сможете повторно использовать свойство testButton.
Если вы установили нулевую ссылку, но объект по-прежнему является подчиненным в иерархии вашего представления, то он останется там до тех пор, пока его супервизор не будет уничтожен, но вы никогда не сможете манипулировать этим объектом снова, поскольку ваш ссылка на объект отсутствует.
В общем, если в вашей программной логики свойство может стать нулевым при его объеме безопаснее объявить его как ?
факультативный, а не как !
сила развернула необязателен, так как сила, развернутая вызовет сбой, если доступ в то время как они равны нулю.
Надеюсь, я был достаточно ясным и ответил на ваши сомнения.
Edit:
Создание вид программно; Во-первых, неплохо не иметь выхода для справки. если новый разработчик входит в ваш проект и видит выход, он рассчитывает найти его на xib или раскадровке соответствующей розетки; он не ожидает, что увидит эту розетку, созданную с помощью кода.
В любом случае здесь мы должны обратить внимание на некоторые случаи. Но все они откатываются по тому же правилу:
- слабый не увеличивает количество накоплений, сильный делает.
- Объект, у которого есть count count == 0, немедленно освобождается.
- Слабая ссылка, указывающая на освобождаться экземпляр немедленно переходит в ноль
Чтобы лучше понять:
weak var testButton: UIButton!
func createButton() {
testButton = UIButton()
//Here testButton is already nil, because testButton is weak and
//the new UIButton is not retained.
view.addSubiew(testButton) //crash, because you are accessing
//a nil force unwrapped property
}
определение tesButton, как сильна здесь устраняет проблему.
Different является следующий случай:
weak var testButton: UIButton!
func createButton() {
let localTestButton = UIButton() //this is strong
testButton = localTestButton //this is weak
//here the new UIButton is retained by the localTestButton var
//so its retainCount is 1, so testButton is not nil as its
//reference is not deallocated
view.addSubview(testButton) //all good, this retains the UIButton
//that now has a retain count of 2
//At the end of the scope, all the local var are released, and
//their pointed objects decreases the retainCount.
//in this scope there is just the localTestButton that is released
//so the pointed object's retain count decreases from 2 to 1.
//if in another scope the subview is removed (testButton.removeFromSuperView())
//then the UIButton retain count is 0 and it is deallocated.
//testButton will immediately become nil and no longer usable.
}
На самом деле сильные розетки остается в памяти. Розетки не являются опциями, поэтому вы не можете назначить их нулевым, иначе вы получили сбой. –
Сильный будет там, пока какой-либо ваш собственный созданный объект не задержит его. Итак, чтобы ответить на ваш вопрос: «Нужно ли устанавливать сильные переменные на нуль после его использования?» -> № –
http://scottberrevoets.com/2016/03/21/outlets-strong-or-weak/ –