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
| 在 Swift 中,内存管理是通过 ARC(Automatic Reference Counting,自动引用计数)来实现的。 ARC 负责追踪和管理引用类型(类实例)的内存,确保在不再需要时释放它们所占用的内存空间,避免内存泄漏。
ARC 引用类型主要有三种:strong、weak 和 unowned。
1-strong 引用: 默认情况下,Swift 中的引用都是强引用。 强引用会增加对象的引用计数,使其在有至少一个强引用时保持在内存中。 只要还有至少一个强引用指向对象,对象就不会被销毁。
class Person { var name: String init(name: String) { self.name = name } }
var person1: Person? = Person(name: "Alice") // 强引用 var person2 = person1 // 强引用 person1 = nil // 引用计数减一,但仍有一个强引用存在 person2 = nil // 引用计数为零,对象销毁
2-weak 引用: 弱引用不会增加对象的引用计数,因此不会保持对象在内存中。 当对象被释放后,弱引用会自动置为 nil。 弱引用通常用于避免循环引用。
class Apartment { var number: Int init(number: Int) { self.number = number } weak var tenant: Person? // 弱引用 }
var alice: Person? = Person(name: "Alice") var apt: Apartment? = Apartment(number: 123) apt?.tenant = alice // 强引用和弱引用 alice = nil // Person 实例被释放,弱引用自动置为 nil
3-unowned 引用: 与弱引用类似,但是前提是对象不会在引用释放后变为 nil。 使用 unowned 引用要确保对象在引用释放后不会被访问, 否则会导致访问已释放的对象,产生运行时错误。
class Country { let name: String init(name: String) { self.name = name } var capitalCity: City! }
class City { let name: String unowned let country: Country // 无主引用 init(name: String, country: Country) { self.name = name self.country = country } }
var country = Country(name: "Canada") var city = City(name: "Ottawa", country: country) // 强引用和无主引用 country.capitalCity = city // 循环引用
ARC 会在编译时自动插入适当的引用计数代码,因此开发者通常无需手动管理引用计数。 然而,在处理循环引用时,需要特别注意使用 weak 和 unowned 引用来避免内存泄漏。
|