Почему инициализация до weak var
возвращает переменную как nil
, а инициализация на обычный var
возвращает ожидаемый результат? В следующем коде на ViewController.swift
:Почему инициализация `weak` возвращает` nil` в Swift?
weak var myButton: UIButton!
var myButtonNotWeak: UIButton!
override func viewDidLoad() {
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)
myButton = UIButton(frame: frame)
myButtonNotWeak = UIButton(frame: frame)
print("\(myButton), \(myButtonNotWeak)")
}
Это регистрирует следующее в консоли:
nil, <UIButton: 0x7f946bc424a0; frame = (0 0; 100 100); opaque = NO; layer = <CALayer: 0x7f946bc42920>>
Но почему первое возвращение nil
? Я думаю, что если вы определяете переменную как weak
, тогда, когда контроллер вида, который определил «слабую переменную» (self
в этом случае), исчез, «слабая переменная» исчезла в соответствии с ним. Тем не менее, я считаю, что я не удаляю экземпляр ViewController в коде, не назначая ему nil
, особенно в его методе viewDidLoad()
.
Итак, если я правильно понял, почему «слабая переменная» возвращает nil
при запуске? Когда я использую его с @IBOutlet
, он не становится nil
(но мне не нужно явно его проверять). И должен ли я определять переменную экземпляра без weak
, когда я хочу ее исключить из кода, особенно в пределах viewDidLoad()
?
Я хочу сохранить переменную за пределами viewDidLoad()
, потому что я хочу обратиться к экземпляру с помощью других методов. Каков наилучший способ в этом случае?
https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf стр. 62: недавно выделенный объект не имеет сильных ссылок на него, поэтому он немедленно освобождается, а someObject установлен на ноль. –
В Swift есть два типа слабых ссылок: слабый, такой же, как в Objective-C, и не используется. Разница в том, что неизменная ссылка никогда не может быть нулевой. – gabbler