-
Notifications
You must be signed in to change notification settings - Fork 0
/
31-strong-binding.swift
85 lines (63 loc) · 1.71 KB
/
31-strong-binding.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
class A
{
var x:Int
var y:B?
init(_ x:Int=0)
{
self.x=x
print("Initializer called for class A object")
}
deinit
{
print("Deinitialzer called for class B object")
}
func Print()
{
print("\(x) \(y!)")
}
}
class B
{
var x:String
var y:A?
init(_ x:String="Hello")
{
self.x=x
print("Initializer called for class A object")
}
deinit
{
print("Deinitialzer called for class B object")
}
func Print()
{
print("\(x) \(y!)")
}
}
var obA:A?=A(250) //A? is necessary so that explicitly the object could be mad nil
print(isKnownUniquelyReferenced(&obA))
// print(isKnownUniquelyReferenced(&obB)) Error since obB is not yet created
var obB:B?=B("World")
print(isKnownUniquelyReferenced(&obA))
print(isKnownUniquelyReferenced(&obB))
obA!.y=obB
print(isKnownUniquelyReferenced(&obA))
print(isKnownUniquelyReferenced(&obB))
obB!.y=obA
print(isKnownUniquelyReferenced(&obA))
print(isKnownUniquelyReferenced(&obB))
obA!.Print()
obB!.Print()
print(isKnownUniquelyReferenced(&obA))
print(isKnownUniquelyReferenced(&obB))
/*Uncomment the below two lines to make the deinitializers called at the end*/
// obA!.y=nil
// obB!.y=nil
obA=nil
print(isKnownUniquelyReferenced(&obA))
print(isKnownUniquelyReferenced(&obB))
obB=nil
print(isKnownUniquelyReferenced(&obA))
print(isKnownUniquelyReferenced(&obB))
/*Deinitializer is not yet called even if the references are made nil because of strong binding, i.e. the obA.y and obB.y still have the reference
of each other classes, so you need to remove those references first by uncommenting above lines, and call the Deinitializer.*/