官术网_书友最值得收藏!

Using unowned

In our particular example, we cannot guarantee the duration of the life cycle of our objects, so unowned is unfit us example. Also, unowned provides fewer guarantees than weak, in terms of safety, can't be applied to Optionals. If you can't use weak for logic reasons, then there's little chance you'll be able to use unowned.

Let's investigate another piece of code involving credit cards, borrowed from Chapter 1, Refreshing the Basics.

First, let's see the code without the unowned modifier under the memory debugger:

class Card {
let owner: Person
init(_ owner: Person) {
self.owner = owner
}
}

class Person {
let name: String
var cards = [Card]()
init(name: String) {
self.name = name
}
}

func runTests() {
let batman = Person(name: "Batman")
batman.cards.append(Card(batman))
batman.cards.append(Card(batman))
batman.cards.append(Card(batman))
}

runTests()

This simple program should not leave any objects behind after runTests() finishes running; however, because we have a strong reference cycle between Person and Card, that is not the case, and all of the created objects will leak:

All of our objects have leaked, as shown in the preceding screenshot. This example is perfect for using unowned. The Card object can't live without an owner. So, whenever the owner is deallocated, all of the cards should be destroyed as well, as we'll never reference a card without its owner. We need to update our Card class to reflect that the Card objects are not retaining their owner:

class Card {
unowned let owner: Person
init(_ owner: Person) {
self.owner = owner
}
}

With this addition, the card cannot be allocated without a Person, and this person has to exist to be a valid card. In the next section, you'll see the issues that unowned can cause, and how we can prevent them.

主站蜘蛛池模板: 福州市| 江华| 会理县| 恩施市| 邳州市| 左贡县| 天镇县| 乐都县| 延吉市| 钦州市| 邯郸市| 西华县| 冷水江市| 盐边县| 靖边县| 崇州市| 正安县| 冷水江市| 蒙阴县| 九江县| 长泰县| 长春市| 久治县| 五指山市| 五华县| 长乐市| 宜昌市| 嘉定区| 安宁市| 汝阳县| 景东| 揭东县| 古交市| 盐边县| 永德县| 苏尼特左旗| 河西区| 淮安市| 南充市| 深水埗区| 克拉玛依市|