我有一个班级Style
,我在其中一个视图控制器中访问它:
class Style {
static var textSize: CGFloat = 17
deinit {
print("i have been deinitiated")
}
}
当我打开此视图控制器时,它会将textSize设置为30
:
class SecondVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Style.textSize = 30
let label = UILabel()
label.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
label.text = "Some text"
label.font = UIFont.systemFont(ofSize: Style.textSize, weight: .light)
view.addSubview(label)
}
}
当我返回初始视图控制器并取消分配SecondVC
时,Style
的textSize仍为30
。
班级Style
会怎样?在运行乐器时,我没有看到关于班级Style
的任何信息。我了解课程Style
从未初始化,但它在哪里保存textSize
的信息?
答案 0 :(得分:1)
您已在课程static var
中定义Style
,其值为17
,现在已存储在data
中。执行Style.textSize = 30
后,textSize
变为30
,而SecondVC
已deinit-ed
,则不会影响textSize
因为他们没有关系。 textSize
仍为30
。
当你说Style.textSize = 30
Style
不是Style()
而不是SecondVC
的属性,而只是一个类引用用于调用静态var {{1} }
如果您将textSize
更改为static var textSize: CGFloat = 17
而将var textSize: CGFloat = 17
更改为Style.textSize = 30
,则会看到差异。
您也可以阅读this
答案 1 :(得分:1)
如果您想创建Global
课程,请使用Singleton
代替instance
:
class Singleton {
static let sharedInstance = Singleton()
var textSize = CGFloat()
}
分配值:
Singleton.sharedInstance.textSize = 30
获取价值:
let textSize = Singleton.sharedInstance.textSize.count
通过执行此操作,您可以确保只有一个实例可以为Singleton
调用,并且您将获得该实例的值。
这是根据Apples首选的Singleton风格。阅读更多相关信息here。
答案 2 :(得分:1)
静态变量永远不会被释放。静电永远存在。下面的代码将在set style = nil
后调用deinitclass Style {
var textSize: CGFloat = 17
deinit {
print("i have been deinitiated")
}
}
class Singleton {
static weak var weakReference : Style?
static var shared: Style {
get {
guard let style = weakReference else {
let style = Style()
weakReference = style
return style
}
return style
}
}
}
class SecondVC: UIViewController {
var str: Style? = Singleton.shared
override func viewDidLoad() {
super.viewDidLoad()
str?.textSize = 30
str = nil
}
}
答案 3 :(得分:-1)
搜索swift static,或者阅读Swift编程语言(属性),你会得到答案。重要的是"静态"