2014-10-01 2 views
9

Почему инициализация до 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(), потому что я хочу обратиться к экземпляру с помощью других методов. Каков наилучший способ в этом случае?

+1

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf стр. 62: недавно выделенный объект не имеет сильных ссылок на него, поэтому он немедленно освобождается, а someObject установлен на ноль. –

+0

В Swift есть два типа слабых ссылок: слабый, такой же, как в Objective-C, и не используется. Разница в том, что неизменная ссылка никогда не может быть нулевой. – gabbler

ответ

14

weak означает, что переменная не сохраняет объект, и он будет освобожден, если нет других сильных ссылок на него. @IBOutletweak переменные не ноль, потому что эти представления имеют сильные ссылки из иерархии представлений диспетчера представлений.

Вы должны обратиться с сильной ссылкой на свою кнопку и добавить ее для просмотра иерархии, прежде чем вы сможете присвоить ее слабой собственности, или просто не используйте свойство weak.

+0

с любопытством. так в каком случае я должен использовать слабый? кажется, что я всегда должен использовать сильное, если бы ссылка цикла не была бы – ikzjfr0