2016-05-18 2 views
0

Требуется уточнение по блокам и закрытию.Пояснение к блоку/закрытию

  1. Как блоки сохраняют объект? или почему нам нужно использовать только слабый внутренний блок? Что произойдет, если мы не будем следовать этому? Или, пожалуйста, дайте некоторую ясность в отношении блока.

  2. Нижняя часть одной крышки для закрытия.

Я написал несколько таких кодов. favouriteButton является собственностью самого себя.

favouriteButton.hidden = false 
dispatch_async(dispatch_get_main_queue(), { 
    self._collectionView.reloadData() 
}) 

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

dispatch_async(dispatch_get_main_queue(), { 
    favouriteButton.hidden = false 
    self._collectionView.reloadData() 
}) 

Это показывает ошибка как

ссылкой на собственность 'favouriteButton' в закрытии требует явного 'я'

dispatch_async(dispatch_get_main_queue(), { 
    self.favouriteButton.hidden = false 
    self._collectionView.reloadData() 
}) 

Может ли один объяснить, как использовать замыкание/эффективно.

  1. Работает ли блоки и затворы одинаково?

ответ

4

В Swift (и Objective-C) блок представляет собой замыкание. Термин замыкание относится к индивидуально исполняемому блоку кода, который захватывает значения переменных в охватывающей области. В случае Swift закрывающая область обычно является функцией, и только переменные, используемые в блоке, захватываются.

Причина, по которой вам необходимо использовать ссылки на уровне класса (свойства и вызовы функций) с помощью self., заключается в том, чтобы сделать явным захват self. Это позволяет указать способ, которым захвачен self (или любая другая ссылка на объект): сильный (по умолчанию) или слабый.

Есть две причины быть осторожными с сохранением объектов (содержащих сильные ссылки) внутри блока.

  1. Наиболее распространенной проблемой является создание цикла удержания. Здесь блок сохраняет сильную ссылку на объект, который, в свою очередь, имеет сильную ссылку на блок. Пока одна из ссылок не будет явно нарушена, ни блок, ни объект не будут выпущены. (Освобождение блока просто очищает захваченные переменные. Исполняемый код остается.)

  2. Сильная ссылка на объект внутри блока может сохранить объект живым дольше, чем предполагалось. Например, если блок сохраняет ссылку на контроллер представления, который выталкивается из стека навигации, вы, вероятно, не хотите, чтобы этот блок работал на контроллере представления при его выполнении. Этого можно избежать, взяв слабую ссылку на контроллер вида. Это позволяет отключить диспетчер представлений, когда он выскочил, и блок становится нерабочим.

Смежные вопросы