Должны ли мы всегда использовать [unowned self] внутри замыкания в Swift

Этот код работает для меня. Это то, что вы пытаетесь сделать?

<input type="file" style="position:absolute;left:-999px;" id="fileinput" />
<button  id="addfiles" >Add files</button>

<script language="javascript" type="text/javascript">
   $("#addfiles").click(function(){
      $("#fileinput").click();
   });
</script>
443
задан Ryan Heitner 16 May 2017 в 11:30
поделиться

2 ответа

Я думал, что добавлю несколько конкретных примеров специально для контроллера представления. Многие из объяснений, не только здесь о переполнении стека, действительно хороши, но я лучше работаю с примерами из реального мира (у @drewag было хорошее начало для этого):

  • Если у вас есть закрытие для обрабатывать ответ от сетевых запросов использования weak, потому что они долгоживущие. Контроллер представления может закрыться до завершения запроса, поэтому self больше не указывает на действительный объект при вызове замыкания.
  • Если у вас есть замыкание, которое обрабатывает событие на кнопке. Это может быть unowned, потому что как только контроллер вида уходит, кнопка и любые другие элементы, на которые он может ссылаться из self, одновременно исчезают. Закрывающий блок также исчезнет одновременно.

    class MyViewController: UIViewController {
          @IBOutlet weak var myButton: UIButton!
          let networkManager = NetworkManager()
          let buttonPressClosure: () -> Void // closure must be held in this class. 
    
          override func viewDidLoad() {
              // use unowned here
              buttonPressClosure = { [unowned self] in
                  self.changeDisplayViewMode() // won't happen after vc closes. 
              }
              // use weak here
              networkManager.fetch(query: query) { [weak self] (results, error) in
                  self?.updateUI() // could be called any time after vc closes
              }
          }
          @IBAction func buttonPress(self: Any) {
             buttonPressClosure()
          }
    
          // rest of class below.
     }
    
78
ответ дан possen 16 May 2017 в 11:30
поделиться

Если ничего из вышеперечисленного не имеет смысла:

tl; dr

Так же, как implicitly unwrapped optional, если вы можете гарантировать , что ссылка не будет равна нулю в точке ее использования, используйте неизвестную. Если нет, то вы должны использовать слабый.

Объяснение:

Ниже я нашел следующее: слабая ссылка без связи . Исходя из того, что я понял, непризнанное «я» не может быть равным нулю, но слабое «я» может быть, а непризнанное «я» может привести к висящим указателям ... что-то позорное в Objective-C. Надеюсь, это поможет

«НЕИЗВЕСТНЫЕ Слабые и неизвестные ссылки ведут себя одинаково, но НЕ одинаковы».

Неизвестные ссылки, как слабые ссылки, не увеличивают количество сохраняемых объектов, на которые ссылаются. Тем не менее, в Swift, неизвестная ссылка имеет дополнительное преимущество , поскольку она не является опциональной . Это делает их более легкими в управлении , чем использование необязательного связывания. Это мало чем отличается от неявно развернутых опций. Кроме того, неизвестные ссылки являются ненулевыми . Это означает, что когда объект освобождается, он не обнуляет указатель. Это означает, что использование неизвестных ссылок может, в некоторых случаях, приводить к висящим указателям . Для вас, ботаников, которые помнят дни Objective-C, как и я, неподтвержденные ссылки отображаются на unsafe_unretained.

1116 Вот где это немного сбивает с толку.

Слабые и неизвестные ссылки не увеличивают количество сохраняемых данных.

Они оба могут быть использованы для прерывания удержания циклов. Так когда же мы их используем ?!

Согласно документам Apple :

«Используйте слабую ссылку, когда она действительна , чтобы эта ссылка в какой-то момент стала нулевой в течение своей жизни. И наоборот, используйте неизвестную ссылку, если вы знаете, что ссылка никогда не будет равна нулю, если она была установлена ​​во время инициализации ».

0
ответ дан Dennis 16 May 2017 в 11:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: