1) ARC: 类class属于引用类型,传递的是对象的指针,而这些对象存储在堆中,系统会自动管理堆中的这些对象,一旦没有指针指向对象,那么对象会马上被清理掉,这就是自动引用计数机制(ARC)。实例化一个Person的类,指向一个变量John,此时产生一个强引用,令John = nil 使得强引用释放,自动调用deinit析构函数,打印“It is deinitialized”
class Person{
var name: String
init(name: String){
self.name = name
}
deinit{
println("It is deinitialized")
}
}
var John:Person? = Person(name: "john")
John = nil
//"It is deinitialized"
2) static:在变量或是方法前加该关键字,表示调用时是类本身,而不是类的实例;调用address变量时,只能用Person类本身,不能用类的实例John来调用
class Person{
var name: String
static var address: String = "BeiJing"
init(name: String,address: String){
self.name = name
Person.address = address
}
deinit{
println("It is deinited")
}
}
var John = Person(name: "john", address: "FuJian")
println("His name is \(John.name)")
//"His name is john"
println("His address is \(Person.address)")
//"His address is FuJian"
3)属性观察器:可以用来监测属性的变化,didSet:在设置新的值之后调用,旧指oldValue,属性变化之后做点什么 ;wilSet,在设置新的值之前调用,新值newValue,属性变化之前做点什么。注意didSet和willSet不会在初识化时调用。
<pre name="code" class="plain">class Person{
var information: String = "00"
var name: String = "11"{
willSet{
self.information = newValue
//name改变为“22”之前,此时newValue = "22",{information "22" name "11"}
}didSet{
self.information = oldValue
//name改变为“22”之后,此时oldValue = "11",{information "11" name "22"}
}
}
}
let john = Person()
//{information "00" name "11"}
john.name = "22"
//{information "22" name "11"}//{information "11" name "22"}
4)惰性实例化:在var变量前加关键字“lazy”,代表只有在被用到的时候才会初识化,用来处理复杂的初始化依赖,是非常好的特性。
class Person{
lazy var lazyName: String = "00"
var name: String = "11"
}
let john = Person()//实例化Person,变量lazyName没有被用,所以没有初识化,为nil,变量name直接初始化为“11”
//{nil name "11"}
john.name
//"11"
john.lazyName //<span style="font-family: Arial, Helvetica, sans-serif;">变量lazyName被用到,初识化为“00”</span>
//"00"