Swift基础(八):析构过程、ARC、强弱引用、可空链式调用等

目录:

1.析构过程:deinit

2.自动引用计数:用ARC来管理内存

3.类之间的强引用与弱引用、无主引用

4.闭包引起的强循环引用及解决办法

5.可空链式调用:可空链式调用定义类、可空链式设置属性值、可空链式调用方法、通过可空链式调用来访问下标、多层连接、对返回可空值的函数进行链接



//1.析构过程:deinit

class Player {

    var coinsInPurse: Int

    init(coins: Int)

    {

        self.coinsInPurse = coins;

        print("Player 构造");

    }

    func winCoins(coins: Int)

    {

        

    }

    deinit//析构

    {

        coinsInPurse = 0;

        print("Player 析构");

    }

}

//2.自动引用计数:用ARC来管理内存


var ref1 : Player?;

var ref2 : Player?;

ref1 = Player(coins: 2);//print("Player 构造");

ref2 = ref1;

ref2 = nil;

ref1 = nil;//print("Player 析构"); 引用计数归0


//3.类之间的强引用与弱引用、无主引用


//4.闭包引起的强循环引用及解决办法


//5.可空链式调用:可空链式调用定义类、可空链式设置属性值、可空链式调用方法、通过可空链式调用来访问下标、多层连接、对返回可空值的函数进行链接

class Address

{

    var buildingName: String?

    var buildingNumber: String?

    var street: String?

    func buildingIdentifier() -> String?

    {

        if buildingName != nil

        {

            return buildingName;

        }

        else if buildingNumber != nil

        {

            return buildingNumber;

        }

        else

        {

            return nil;

        }

    }

}

class Residence

{

    var numberOfRooms = 1;

    var address: Address?

    func printNumberOfRooms()

    {

        print("The number of rooms is \(numberOfRooms)")

    }

}


class Person

{

    var residence: Residence?;

}


let john = Person();


// residence 后面添加问号之后,Swift就会在 residence 不为空的情况下访问 numberOfRooms

if let roomCount = john.residence?.numberOfRooms

{

    print("John's residence has \(roomCount) room(s).");

}

else

{

    print("Unable to retrieve the number of rooms.");

}


//可空链式调用定义类

let john1 = Person()

if let roomCount = john.residence?.numberOfRooms

{

    print("John's residence has \(roomCount) room(s).");

}

else

{

    print("Unable to retrieve the number of rooms.");

}

let someAddress = Address()

someAddress.buildingNumber = "29"

someAddress.street = "Acacia Road"

//可空链式设置属性值

john.residence?.address = someAddress;//通过 john.residence 来设定 address 属性也是不行的,因为 john.residence nil

//可空链式调用方法

if john1.residence?.printNumberOfRooms() != nil

{

    print("It was possible to print the number of rooms.")

} else

{

    print("It was not possible to print the number of rooms.")//打印此行

}

//通过可空链式调用来访问下标


//访问可空类型的下标

var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]

testScores["Dave"]?[0] = 91

testScores["Bev"]?[0]++

testScores["Brian"]?[0] = 72 //nil不存在

//testScores ["Bev": [80, 94, 81], "Dave": [91, 82, 84]]


//多层连接

//if let johnsStreet = john.residence?.address?.street {


//对返回可空值的函数进行链接

if let buildingIdentifier = john.residence?.address?.buildingIdentifier()

{

    print("John's building identifier is \(buildingIdentifier).")

}

if let beginsWithThe =

    john.residence?.address?.buildingIdentifier()?.hasPrefix("The")

{//buildingIdentifier()? ?号在()后表示返回值可为空,不是函数本身

        if beginsWithThe

        {

            print("John's building identifier begins with \"The\".")

        }

        else

        {

            print("John's building identifier does not begin with \"The\".")

        }

}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值