Swift编程基础(五)

课程来源于:Swift编程基础

41. 自动内存释放, 反初始化器

41.1 自动引用计数ARC工作机制

  • 自动引用
class Test{
    var name:String
    
    init(name:String) {
        self.name = name
    }
}

var t1 = Test(name: "hello")

var t2 = t1

var t3 = t2

t3.name = "aaa"

print(t1.name)
aaa
  • ARC工作机制
    对象没有一个引用就会自动销毁, 内存销毁.

41.2 强引用

var t1 = Test(name: "hello") //强引用

41.3 反初始化器

class Test{
    var name:String

    init(name:String) {
        self.name = name
    }
    
    deinit {
        print("销毁中... " + self.name)
    }
}

var t1:Test? = Test(name: "hello")

var t2:Test? = t1

var t3:Test? = t2

t1 = nil
t2 = nil
t3 = nil


var t:Test? = Test(name: "world")
t = nil
销毁中... hello
销毁中... world

42. 循环引用, 弱引用weak

42.1 循环引用

在这里插入图片描述

class TestA {
    var name:String
    
    var ref:TestB? = nil
    
    
    init(name:String) {
        self.name = name
    }
    
    deinit {
        print("销毁中ing: " + self.name)
    }
}


class TestB {
    var name:String
    
    var ref2:TestA? = nil
    
    init(name:String) {
        self.name = name
    }
    
    deinit {
         print("销毁中ing: " + self.name)
    }
    
}

var testA:TestA? = TestA(name: "A")

var testB:TestB? = TestB(name: "B")

//循环引用
testA!.ref = testB

testB!.ref2 = testA

//先把类中的循环引用里面的销毁
testA!.ref = nil

testB!.ref2 = nil

//然后销毁直接引用
testA = nil

testB = nil
销毁中ing: A
销毁中ing: B

42.2 弱引用weak

在这里插入图片描述

class TestA {
    var name:String
    
    //弱引用
    weak var ref:TestB? = nil
    
    
    init(name:String) {
        self.name = name
    }
    
    deinit {
        print("销毁中ing: " + self.name)
    }
}


class TestB {
    var name:String
    
    //弱引用
    weak var ref2:TestA? = nil
    
    init(name:String) {
        self.name = name
    }
    
    deinit {
         print("销毁中ing: " + self.name)
    }
    
}

var testA:TestA? = TestA(name: "A")

var testB:TestB? = TestB(name: "B")

//循环引用
testA!.ref = testB

testB!.ref2 = testA


//然后销毁直接引用
testA = nil

testB = nil
销毁中ing: A
销毁中ing: B

43. 无主引用unowned

在这里插入图片描述
先置空1, 然后置空2, 因为TestB没有引用了, 则自动把3置空了,销毁TestB 最后才把TestA销毁

class TestA {
    var name:String
    
    var ref:TestB? = nil
    
    init(name:String) {
        self.name = name
    }
    
    deinit {
        print("销毁中ing: " + self.name)
    }
}


class TestB {
    var name:String
    
    var ref2:TestA
    
    init(name:String, ref2:TestA) {
        self.ref2 = ref2
        self.name = name
    }
    
    deinit {
         print("销毁中ing: " + self.name)
    }
    
}

var testA:TestA? = TestA(name: "A")

//循环引用
testA!.ref = TestB(name: "B", ref2:testA!)

testA!.ref = nil

//然后销毁直接引用
testA = nil
销毁中ing: B
销毁中ing: A

43.1 无主引用

在这里插入图片描述
直接置空1, 则TestA先被销毁, 然后TestB再销毁.

class TestA {
    var name:String
    
    var ref:TestB? = nil
    
    init(name:String) {
        self.name = name
    }
    
    deinit {
        print("销毁中ing: " + self.name)
    }
}


class TestB {
    var name:String
    
    //无主引用, 这是有值的
    unowned var ref2:TestA
    
    init(name:String, ref2:TestA) {
        self.ref2 = ref2
        self.name = name
    }
    
    deinit {
         print("销毁中ing: " + self.name)
    }
    
}

var testA:TestA? = TestA(name: "A")

//循环引用
testA!.ref = TestB(name: "B", ref2:testA!)

//testA!.ref = nil

//然后销毁直接引用
testA = nil
销毁中ing: A
销毁中ing: B

44. 闭包循环引用, 定义捕获列表

class Test {
    var name:String
    
//    lazy var data:() -> Void = {() -> Void in
//    //    self引用了对象
//        print("姓名: " + self.name)
//    }
//    定义捕获列表
    lazy var data:() -> Void = {[unowned self]() -> Void in
        print("姓名: " + self.name)
    }
    
    init(name:String) {
        self.name = name
    }
    
    deinit {
        print("Test的实例被释放 - " + self.name)
    }
}

var t:Test? = Test(name: "hello")

t!.data()

t = nil
姓名: hello
Test的实例被释放 - hello

45. 可选链展开

class Data {
    var name:String
    
    init(name:String) {
        self.name = name
    }
    
    func play(){
        print(self.name)
    }
}

class Test {
    var name:String
    
    var data:Data? = nil
    
    init(outname name:String, data:Data){
        self.name = name
        self.data = data
    }
    
    deinit {
        print("Test的实例被释放 - " + self.name)
    }
}

var t:Test? = Test(outname: "hello", data: Data(name: "world"))

t = nil

//可选链展开
(t?.data)?.play()

//会报错
//(t?.data)!.play()

Test的实例被释放 - hello

46. 尾随闭包

46.1 多个参数的尾随闭包

func play1(param1:String, param2:(String) -> Void){
    param2(param1 + "Swift")
}

play1(param1: "hello ", param2: {(data:String) -> Void in
    print(data)
})

// 上式简写
play1(param1: "hello ", param2: {(data) in
    print(data)
})

//尾随闭包: 必须是在最后一个参数位置
play1(param1: "world ") { (data:String) -> Void in
    print(data)
}

//上式简写
play1(param1: "world ") { (data) in
    print(data)
}
hello Swift
hello Swift
world Swift
world Swift

46.2 一个函数参数的尾随闭包

func play2(param:(String) -> String){
    var value = param("swift")
    
    print("返回值: " + value)
}

play2(param: {(data:String) -> String in
    return data + " - ios"
})

//尾随闭包
play2(){(data:String) -> String in
    return data + " - ios"
}

//上式简写
play2 { (data) -> String in
    return data + " - ios"
}
返回值: swift - ios
返回值: swift - ios
返回值: swift - ios

46.3 一个无参数无返回值函数参数的尾随闭包

func play3(param:() -> Void){
    param()
}

play3 (param: {() -> Void in
    print("play3")
})

play3(param: {
    print("play3")
})

play3(){
    print("play3")
}

play3 {
    print("play3")
}
play3
play3
play3
play3

46.4 一个无参数有返回值函数参数的尾随闭包

func play4(param:() -> String){
    var value = param()
    
    print("value4: " + value)
}

play4(param: { () -> String in
    return "hello world"
})

play4 (){ () -> String in
    return "hello world"
}

play4 (){
    return "hello world"
}

play4 { () -> String in
    return "hello world"
}

play4 {
    return "hello world"
}
value4: hello world
value4: hello world
value4: hello world
value4: hello world
value4: hello world

46.5 不是尾随闭包

尾随闭包满足的条件是: 函数参数是该函数的最后一个参数

func play5(param:(Int) -> Void, param2:(Int)){
    param(param2 * 2)
}

play5(param: {(data:Int) -> Void in
    
    print(data)
    
}, param2: 100)


play5(param: {(data) in
    
    print(data)
    
}, param2: 100)

200
200

47 错误捕获和处理

捕获错误后直接用异常处理

enum TestError:String, Error{
    case error1 = "错误1"
    case error2 = "错误2"
}

func play(param:Int) throws -> String{
    if(param < 0){
        throw TestError.error1
    }else if(param >= 0 && param <= 10){
        throw TestError.error1
    }

    print("执行正常")
    return "hello world"
}


do {
    var value = try play(param: 100)

    print(value)
}
catch TestError.error1 {
    print(TestError.error1.rawValue)
}
catch TestError.error2 {
    print(TestError.error2.rawValue)
}
defer {
    print("defer")
}
执行正常
hello world
defer

捕获错误后用可选类型处理

enum TestError:String, Error{
    case error1 = "错误1"
    case error2 = "错误2"
}

func play(param:Int) throws -> String{
    if(param < 0){
        throw TestError.error1
    }else if(param >= 0 && param <= 10){
        throw TestError.error1
    }
    
    print("执行正常")
    return "hello world"
}

var value = try? play(param: 100)

print(value != nil ? value! : "unknown")
print(value ?? "unknown")
if let p = value {
    print(p)
}else{
    print("unknown")
}

执行正常
hello world
hello world
hello world

只有确定时同一个枚举错误时候可以用.表示

func play2(param:TestError){
    print("ssss")
}
play2(param: .error1)
ssss

48. 泛型类型限定, 协议关联类型

48.1 泛型的类型限定

class Data {
    var name:String
    
    init(name:String) {
        self.name = name
    }
}

//func play<T:Data>(param: T){
//    print(param.name)
//}
//
//play(param: Data(name: "world"))


//需要向下类型转换
func play<T:Any>(param: T){
    var a = param as! Data
    print(a.name)
}

play(param: Data(name: "world"))

world

48.2 协议中的类型限定

protocol Test{
    //限定类型
    associatedtype D:Data
    
    func play(param: D)
}

class Student: Test{
    func play(param: Data) {
        print(param.name)
    }
}

var s = Student()
s.play(param: Data(name: "world"))
world

49. 访问权限简单说明

  • private
  • fileprivate
  • internal
  • public
  • open
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值