Swift中三大特性&自动引用计数

三大特性

继承

  • 如果我们要定义一个class表示一个人
  • 它有两个属性表示name和age:
class Person {
    let name: String
    let age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}
  • 接下来,如果我们还需要一个类表示一个学生呢?
  • 最想当然的做法当然是如法炮制一个类似的class
class Student {
    var name : String
    var age : Int
    var ID : String

    init(name : String, age : Int, ID : String) {
        self.name = name
        self.age = age
        self.ID = ID
    }
}

在Person和Student里,有很多内容都是重复的

  • 它们的某些属性是重复的
  • 它们的init方法有部分代码也是重复的
  • An Student IS A Person
	•	正确写法应该是使用继承
class Student: Person {
    var ID : String

    init(name : String, age : Int, ID : String) {
        self.ID = ID
        super.init(name: name, age: age)
    }
}

重载

  • 在类中我们可以定义很多行为,比如在Person添加读书的行为
  • 我们会发现子类是可以继承父类的方法的
  • 但是如果子类对父类的行为不满意,可以对父类方法进行重写
  • 在swift中如果对父类的方法进行重写必须在func前加override
// Person中的方法
func readBook() {
    print("在读书")
}

// Student中的方法
override func readBook() {
    print("学生在学习")
}

多态

多态有三大条件

  • 必须有继承
  • 必须有重写
  • 必须是父类指针指向子类对象
// 定义教师类
class Teacher : Person {
    override func readBook() {
        print("老师在备课")
    }
}

// 定义测试方法
func test(person : Person) {
    person.readBook()
}

// 创建对象
let p = Person(name: "cj", age: 20)
let stu = Student(name: "myy", age: 19, ID: "110")
let tea = Teacher(name: "my", age: 18)

// 测试
test(p)
test(stu)
test(tea)

自动引用计数

工作机制

Swift和OC一样,采用自动引用计数来管理内容

  • 当有一个强引用指向某一个动向时,该对象的引用计数会自动+1
  • 当该强引用消失时,引用计数会自动-1
  • 当引用计数为0时,该对象会被销毁

循环引用

  • 在通常情况下,ARC是会自动帮助我们管理内存的
  • 但是在开发中我们经常会出现循环引用的问题,比如下面的示例
  • Student对Book对象有一个强引用
  • 而Book对Student有一个强引用
  • 在两个对象都指向nil时,依然不会被销毁,就形成了循环引用
// 1.创建类
class Student {
    var book : Book?

    deinit {
        print("Student -- deinit")
    }
}

class Book {
    var owner : Student?

    deinit {
        print("Book -- deinit")
    }
}

// 2.创建对象
var stu : Student? = Student()
var book : Book? = Book()

// 3.相互引用
stu?.book = book
book?.owner = stu

// 4.对象置nil
stu = nil
book = nil

解决方案

  • swift提供了两种解决方案
  • weak : 和OC中的__weak一样是一个弱引用.当指向的对象销毁时,会自动将指针指向nil
  • unowned : 和OC中的__unsafe_unretained.当对象销毁时依然指向原来的位置(容易引起野指针)
// 1.创建类
class Student {
    weak var book : Book?
    // unowned var book : Book = Book()

    deinit {
        print("Student -- deinit")
    }
}

class Book {
    var owner : Student?

    deinit {
        print("Book -- deinit")
    }
}

// 2.创建对象
var stu : Student? = Student()
var book : Book? = Book()

// 3.相互引用
stu?.book = book!
book?.owner = stu

// 4.对象置nil
stu = nil
book = nil
posted @ 2016-05-10 14:25  OnlyChenJ  阅读(253)  评论(0编辑  收藏  举报