var или weak var при использовании определения протокола Objective-c в классе Swift. [Дубликат]

У меня была аналогичная ситуация на Mac, и для меня работал следующий процесс:

В терминале введите

vi ~/.profile

Затем добавьте эту строку в файл и save

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk.jdk/Contents/Home

, где версия является той, что на вашем компьютере, например 1.7.0_25.

Выйдите из редактора, затем введите следующую команду, чтобы она стала эффективной

source ~/.profile 

Затем введите java -version, чтобы проверить результат

java -version 

Что такое .profile файл?

. Файл файла является скрытым файлом. Это необязательный файл, который сообщает системе, какие команды запускаться, когда пользователь, чей файл профиля находится в нем. Например, если мое имя пользователя - bruno, и в файле / Users / bruno / содержится все .profile-файл, все его содержимое будет выполняться во время процедуры входа в систему.

Источник: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with- команда-псевдонимы-и-профиль - макинтош-30515

39
задан nwales 5 May 2015 в 14:58
поделиться

3 ответа

Вы обычно делаете протоколы классов (как определено с ключевым словом class) слабыми, чтобы избежать риска «сильного эталонного цикла» (ранее называвшегося «циклом сохранения»). Неспособность сделать делегат слабым не означает, что у вас по сути есть сильный ссылочный цикл, а просто, что вы могли иметь один.

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

На мой взгляд, отказ слабых делегатов класса является лишь частично, чтобы облегчить риск сильный опорный цикл. Это действительно вопрос «собственности». Большинство протоколов делегатов - это ситуации, когда объект, о котором идет речь, не имеет бизнеса, претендующего на владение над делегатом, а просто там, где объект, о котором идет речь, предоставляет возможность сообщить делегату что-либо (или запросить что-нибудь из него).

38
ответ дан Rob 21 August 2018 в 12:28
поделиться
  • 1
    Хотелось бы увидеть пример того, когда протокол struct создает сильный ссылочный цикл, а когда этого не происходит, но этот ответ прояснил для меня многое. – nwales 5 May 2015 в 17:19
  • 2
  • 3
    поэтому, согласно вашему суждению, если я правильно понимаю вещи, пример SnakesAndLadders в документации Apples Swift будет создавать сильный справочный цикл через DiceGameDelegate? [Д0] developer.apple.com/library/ios/documentation/Swift/Conceptual/… – nwales 5 May 2015 в 18:05
  • 4
    Нет сильного эталонного цикла. Рассмотрим график владения объектами. Представьте себе какой-то главный объект (например, контроллер просмотра или что-то еще), которому принадлежат tracker и game. И game также имеет сильную ссылку на tracker. Но нет кругового сильного эталонного цикла. Все в порядке. Чтобы иметь сильный ссылочный цикл, вам понадобится делегат для game, чтобы вернуться к объекту, который сам владеет game. Но это не так. Таким образом, не существует сильного эталонного цикла. – Rob 5 May 2015 в 18:13
  • 5
    Абсолютно. В иерархии объектов дочерний объект не должен поддерживать сильные ссылки на родительский объект. Это красный флаг, указывающий на сильный ссылочный цикл. Обратите внимание, что в этом примере VC сильный ссылочный цикл не всегда проявляется как утечка, но он может быть в особых случаях, поэтому рекомендуется избегать потенциальной проблемы в целом, сделав делегат слабым. – Rob 7 February 2018 в 15:58
protocol MyDelegate: class {
// ...
}
class MyViewController: UIViewController {
    weak var delegate: MyDelegate? 
}
-4
ответ дан Ivailo Kanev 21 August 2018 в 12:28
поделиться
  • 1
    Просьба рассказать о том, как этот код отвечает на вопрос (этот ответ был в очереди проверки низкого качества сообщений). – JAL 6 April 2016 в 21:05
  • 2
    Вопрос: "когда и когда не использовать« слабое »назначение указателю делегата в Swift и почему? & Quot; Это не отвечает на вопрос вообще. – Pang 7 April 2016 в 01:09

Делегаты должны (обычно: редактировать) всегда быть слабыми.

Допустим, b является делегатом a. Теперь свойство a delegate является b.

В случае, когда вы хотите b отпустить, когда c ушел

Если c содержит сильную ссылку на освобождение b и c, вы хотите, чтобы b освобождался от c. Однако, используя сильное свойство делегирования в a, b никогда не будет освобождено, поскольку a сильно удерживает b. Используя слабую ссылку, как только b потеряет сильную ссылку из c, b отключится, когда c отменяется.

Обычно это предполагаемое поведение, поэтому вы хотите использовать свойство weak.

5
ответ дан Schemetrical 21 August 2018 в 12:28
поделиться
  • 1
    Черт возьми, я попробую уточнить, если вам это нужно :-) – Schemetrical 5 May 2015 в 15:31
  • 2
    Я все еще смущен. Если я не могу назначить слабый протокол типа non-class, означает ли это, что это приведет к циклу сохранения? Когда я использую протоколы классов против протоколов non-class? Если я использую struct для я использую только протоколы non class vs class protocol с классом? – nwales 5 May 2015 в 15:45
  • 3
    @nwales Я знаю, что это старый комментарий, но вы используете протокол class, если оба (а) используете ссылочные (class) типы; и (b) вам нужна ссылка weak. В противном случае нет необходимости объявлять его как протокол class. Укажите только class, если это требует протокол (например, это протокол делегата). Таким образом, если вы используете struct (тип значения) или используете class, но не нужно беспокоиться о сильных ссылочных циклах (например, протокол, который используется для чего-то другого, кроме определения интерфейса делегата ), то не делайте его протоколом class. – Rob 7 February 2018 в 16:33
  • 4
    FWIW, достаточно сказать, что делегаты должны always быть слабыми. Рассмотрим URLSession, который сохраняет сильную ссылку на delegate , пока сеанс не будет признан недействительным. Это работает только потому, что они вручную разрешают сильную ссылку, когда сеанс недействителен. Но, как правило, это правильно, что делегаты, как правило, являются слабыми свойствами. +1 – Rob 7 February 2018 в 17:59