2017-02-21 44 views
0

я в основном использовать выходы в качестве слабых переменных, какВ быстром, необходимо ли устанавливать сильные переменные в нуль после его использования?

@IBOutlet weak var testButton: UIButton! 

Но что произойдет, если я использовать сильные вместо слабой, как

@IBOutlet var testButton: UIButton! 

Должен ли я установить его в ноль после его использования?

+0

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

+1

Сильный будет там, пока какой-либо ваш собственный созданный объект не задержит его. Итак, чтобы ответить на ваш вопрос: «Нужно ли устанавливать сильные переменные на нуль после его использования?» -> № –

+0

http://scottberrevoets.com/2016/03/21/outlets-strong-or-weak/ –

ответ

3

Розетки как слабые прекрасны, пока они находятся на экране в качестве подзонов. на самом деле они будут сохранены массивом 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. 
} 
+0

@ARUN KUMAR Я ответил вам, редактируя сообщение. Надеюсь, теперь все ясно. –

-1

В ARC свойство по умолчанию является сильным. Каждый элемент пользовательского интерфейса будет выпущен, когда контроллер будет выпущен, поэтому не беспокойтесь о выпуске элементов интерфейса Storyboad или установке их в ноль (может произойти сбой).

4

Вы получаете некоторые плохие ответы.

Розетки обычно слабы, и неявно развернутые варианты. Это то, что указывает !.

Розетки считаются слабыми, чтобы избежать сохранения иерархии представления в памяти после того, как она больше не нужна. (Обычно выход принадлежит супервизору и просто удаляет его из своего супервизора, заставляет его освободиться. Обычно это правильное поведение. Если вы хотите, чтобы розетка сохранялась после ее удаления из супервизора, вы можете либо создать другую сильную ссылку, либо сделайте выход сильным, но в этом случае вам решать, когда вы закончите с ним)

Розетки следует указать как слабый, за очень небольшим исключением. Да, если вы объявите их сильными, вы должны их потерять, когда закончите с ними. (Хотя, если ваш контроллер просмотра освобожден, это не имеет значения, так как его сильные ссылки исчезнут.)

+0

Что такое обычные переменные типа «var tableData = NSArray()». –

+2

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

+0

Я бы сказал, что нет причин делать выводы слабыми, учитывая, что в 99% случаев их следует хранить в памяти точно так же, как и их владелец. То, что на самом деле кажется мне неправильным, - это сочетание «слабого» и неявно разворачиваемого необязательного. Если вы хотите, чтобы что-то было слабым, это означает, что он является nillable, поэтому должен использоваться обычный дополнительный. – Sulthan