2014-10-01 100 views
9

为什么初始化到weak var返回变量为nil而初始化到通常的var返回预期结果?在上ViewController.swift下面的代码:为什么在Swift中初始化为`weak`会返回`nil`?

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是设为零。 – 2014-10-01 08:40:50

+0

在Swift中,有两种弱引用类型:weak和Objective-C中的一样,并且是无主的。不同的是,一个无主的引用永远不会是零。好奇地, – gabbler 2014-10-01 08:42:16

回答

14

weak表示变量不保留该对象,并且如果没有其他强引用,它将被解除分配。 @IBOutletweak变量不为零,因为这些视图具有来自视图控制器视图层次结构的强引用。

您必须引用强引用您的按钮并将其添加到查看层次结构,然后才能将其分配给弱属性,或者不要使用weak属性。

+0

。所以在这种情况下,我应该使用弱?似乎我应该总是使用强壮的,如果循环参考不会发生 – ikzjfr0 2017-02-21 02:31:24

相关问题