自动引用计数
• 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的区别的,一个文件中可以有多个类