Swift自动引用计数-可选链-协议-懒加载

自动引用计数

•   Swift和OC一样,采用自动引用计数来管理内容
◦   当有一个强引用指向某一个动向时,该对象的引用计数会自动+1
◦   当该强引用消失时,引用计数会自动-1
◦   当引用计数为0时,该对象会被销毁

循环引用

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

可选链

返回值是可选类型
?.就是可选链,系统会自动判断可选类型是否有值

有值则解包, 没值则赋值为nil

协议

基本使用

// 1.定义协议
protocol SportProtocol {
    func playBasketball()
    func playFootball()
}

// 2.遵守协议
// 注意:默认情况下在swift中所有的协议方法都是必须实现的,如果不实现,则编译器会报错
class Person : SportProtocol {
    var name : String?
    var age : Int = 0

    // 实现协议中的方法
    func playBasketball() {
        print("人在打篮球")
    }

    func playFootball() {
        print("人在踢足球")
    }
}

协议之间的继承

protocol CrazySportProtocol {
    func jumping()
}

protocol SportProtocol : CrazySportProtocol {
    func playBasketball()
    func playFootball()
}

协议中可选方法

// 1.定义协议
@objc
protocol SportProtocol {
    func playBasketball()

    optional func playFootball()
}

// 2.遵守协议
class Person : SportProtocol {
    var name : String?
    var age : Int = 0

    // 实现协议中的方法
    @objc func playBasketball() {
        print("人在打篮球")
    }
}

懒加载-lazy

对象在真正使用的时候才真正加载到内存中

// 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性
    // lazy的作用是只会赋值一次
    lazy var array : [String] = {
        () -> [String] in
        return ["why", "lmj", "lnj"]
    }()

文件权限

1> internal: 内部的
默认权限—在本项目中可以访问,一个包,一个target
2>private: 私有的
只能在本类中进行访问
3>open: 公开的
可以跨项目访问的
4>fileprivate: Swift3.0 文件私有
只要在本文件中都可以访问

private和fileprivate的区别的,一个文件中可以有多个类

你可能感兴趣的:(Swift自动引用计数-可选链-协议-懒加载)