zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    模拟实现链表
    模拟实现内存操作函数
    实现一个简单的进度条
    简单的通讯录(C语言实现)
    sizeof和strlen
    动态联编
    不用第三个变量交换两个变量的值
    内存对齐
    字符串指针和字符数组的区别
    vs中的一些bug解决
  • 原文地址:https://www.cnblogs.com/chenjianjian/p/5477723.html
Copyright © 2011-2022 走看看