У меня была аналогичная ситуация на 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-файл, все его содержимое будет выполняться во время процедуры входа в систему.
Вы обычно делаете протоколы классов (как определено с ключевым словом class
) слабыми, чтобы избежать риска «сильного эталонного цикла» (ранее называвшегося «циклом сохранения»). Неспособность сделать делегат слабым не означает, что у вас по сути есть сильный ссылочный цикл, а просто, что вы могли иметь один.
С типами struct
, однако, сильный риск ссылочного цикла значительно уменьшается, поскольку типы struct
не являются «ссылочными» типами, поэтому сложнее создать сильный ссылочный цикл. Но если объект-делегат является объектом класса, тогда вам может понадобиться сделать протокол протоколом класса и сделать его слабым.
На мой взгляд, отказ слабых делегатов класса является лишь частично, чтобы облегчить риск сильный опорный цикл. Это действительно вопрос «собственности». Большинство протоколов делегатов - это ситуации, когда объект, о котором идет речь, не имеет бизнеса, претендующего на владение над делегатом, а просто там, где объект, о котором идет речь, предоставляет возможность сообщить делегату что-либо (или запросить что-нибудь из него).
protocol MyDelegate: class {
// ...
}
class MyViewController: UIViewController {
weak var delegate: MyDelegate?
}
Делегаты должны (обычно: редактировать) всегда быть слабыми.
Допустим, b
является делегатом a
. Теперь свойство a
delegate
является b
.
В случае, когда вы хотите b
отпустить, когда c
ушел
Если c
содержит сильную ссылку на освобождение b
и c
, вы хотите, чтобы b
освобождался от c
. Однако, используя сильное свойство делегирования в a
, b
никогда не будет освобождено, поскольку a
сильно удерживает b
. Используя слабую ссылку, как только b
потеряет сильную ссылку из c
, b
отключится, когда c
отменяется.
Обычно это предполагаемое поведение, поэтому вы хотите использовать свойство weak
.
class
, если оба (а) используете ссылочные (class
) типы; и (b) вам нужна ссылка weak
. В противном случае нет необходимости объявлять его как протокол class
. Укажите только class
, если это требует протокол (например, это протокол делегата). Таким образом, если вы используете struct
(тип значения) или используете class
, но не нужно беспокоиться о сильных ссылочных циклах (например, протокол, который используется для чего-то другого, кроме определения интерфейса делегата ), то не делайте его протоколом class
.
– Rob
7 February 2018 в 16:33
URLSession
, который сохраняет сильную ссылку на delegate
, пока сеанс не будет признан недействительным. Это работает только потому, что они вручную разрешают сильную ссылку, когда сеанс недействителен. Но, как правило, это правильно, что делегаты, как правило, являются слабыми свойствами. +1
– Rob
7 February 2018 в 17:59
tracker
иgame
. Иgame
также имеет сильную ссылку наtracker
. Но нет кругового сильного эталонного цикла. Все в порядке. Чтобы иметь сильный ссылочный цикл, вам понадобится делегат дляgame
, чтобы вернуться к объекту, который сам владеетgame
. Но это не так. Таким образом, не существует сильного эталонного цикла. – Rob 5 May 2015 в 18:13