访问全球课程

时间:2017-10-26 03:01:39

标签: ios swift global

我有一个班级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的信息?

4 个答案:

答案 0 :(得分:1)

您已在课程static var中定义Style,其值为17,现在已存储在data中。执行Style.textSize = 30后,textSize变为30,而SecondVCdeinit-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

后调用deinit
class 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编程语言(属性),你会得到答案。重要的是"静态"