Функции управления памятью и ее использование обрабатываются на языке Swift 4 с помощью автоматического подсчета ссылок (ARC). ARC используется для инициализации и деинициализации системных ресурсов, освобождая тем самым пространство памяти, используемое экземплярами класса, когда экземпляры больше не нужны. ARC отслеживает информацию об отношениях между нашими экземплярами кода для эффективного управления ресурсами памяти.
Функции АРК
-
ARC выделяет кусок памяти для хранения информации каждый раз, когда init () создает новый экземпляр класса.
-
Информация о типе экземпляра и его значениях хранятся в памяти.
-
Когда экземпляр класса больше не нужен, он автоматически освобождает пространство памяти с помощью deinit () для дальнейшего хранения и извлечения экземпляра класса.
-
ARC отслеживает в настоящее время ссылающиеся на свойства экземпляров класса, константы и переменные, так что deinit () применяется только к этим неиспользуемым экземплярам.
-
ARC поддерживает «строгую ссылку» на эти свойства экземпляра класса, константы и переменные, чтобы ограничить освобождение, когда экземпляр класса используется в настоящее время.
ARC выделяет кусок памяти для хранения информации каждый раз, когда init () создает новый экземпляр класса.
Информация о типе экземпляра и его значениях хранятся в памяти.
Когда экземпляр класса больше не нужен, он автоматически освобождает пространство памяти с помощью deinit () для дальнейшего хранения и извлечения экземпляра класса.
ARC отслеживает в настоящее время ссылающиеся на свойства экземпляров класса, константы и переменные, так что deinit () применяется только к этим неиспользуемым экземплярам.
ARC поддерживает «строгую ссылку» на эти свойства экземпляра класса, константы и переменные, чтобы ограничить освобождение, когда экземпляр класса используется в настоящее время.
Программа ARC
class StudDetails { var stname: String! var mark: Int! init(stname: String, mark: Int) { self.stname = stname self.mark = mark } deinit { print("Deinitialized \(self.stname)") print("Deinitialized \(self.mark)") } } let stname = "Swift 4" let mark = 98 print(stname) print(mark)
Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —
Swift 4 98
Экземпляры класса ARC Strong Reference Cycles
class studmarks { let name: String var stud: student? init (name: String) { print("Initializing: \(name)") self.name = name } deinit { print("Deallocating: \(self.name)") } } class student { let name: String var strname: studmarks? init (name: String) { print("Initializing: \(name)") self.name = name } deinit { print("Deallocating: \(self.name)") } } var shiba: studmarks? var mari: student? shiba = studmarks(name: "Swift 4") mari = student(name: "ARC") shiba!.stud = mari mari!.strname = shiba
Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —
Initializing: Swift 4 Initializing: ARC
ARC Слабые и неизвестные ссылки
У свойств типа класса есть два способа разрешения сильных ссылочных циклов —
- Слабые ссылки
- Неизвестные ссылки
Эти ссылки используются, чтобы позволить одному экземпляру ссылаться на другие экземпляры в ссылочном цикле. Тогда экземпляры могут ссылаться на каждый экземпляр вместо того, чтобы заботиться о сильном ссылочном цикле. Когда пользователь знает, что какой-то экземпляр может возвращать значения ‘nil’, мы можем указать это, используя слабую ссылку. Когда экземпляр будет возвращать что-то, а не ноль, объявите это с неизвестной ссылкой.
Слабая справочная программа
class module { let name: String init(name: String) { self.name = name } var sub: submodule? deinit { print("\(name) Is The Main Module") } } class submodule { let number: Int init(number: Int) { self.number = number } weak var topic: module? deinit { print("Sub Module with its topic number is \(number)") } } var toc: module? var list: submodule? toc = module(name: "ARC") list = submodule(number: 4) toc!.sub = list list!.topic = toc toc = nil list = nil
Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —
ARC Is The Main Module Sub Module with its topic number is 4
Неизвестная справочная программа
class student { let name: String var section: marks? init(name: String) { self.name = name } deinit { print("\(name)") } } class marks { let marks: Int unowned let stname: student init(marks: Int, stname: student) { self.marks = marks self.stname = stname } deinit { print("Marks Obtained by the student is \(marks)") } } var module: student? module = student(name: "ARC") module!.section = marks(marks: 98, stname: module!) module = nil
Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —
ARC Marks Obtained by the student is 98
Сильные справочные циклы для замыканий
Когда мы присваиваем замыкание свойству экземпляра класса и телу замыкания для захвата конкретного экземпляра, может произойти сильный ссылочный цикл. Сильная ссылка на замыкание определяется с помощью «self.someProperty» или «self.someMethod ()». Сильные опорные циклы используются в качестве опорных типов для замыканий.
class HTMLElement { let samplename: String let text: String? lazy var asHTML: () -> String = { if let text = self.text { return "<\(self.samplename)>\(text)</\(self.samplename)>" } else { return "<\(self.samplename) />" } } init(samplename: String, text: String? = nil) { self.samplename = samplename self.text = text } deinit { print("\(samplename) is being deinitialized") } } var paragraph: HTMLElement? = HTMLElement(samplename: "p", text: "Welcome to Closure SRC") print(paragraph!.asHTML())
Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —
<p>Welcome to Closure SRC</p>
Слабые и неизвестные ссылки
Когда замыкание и экземпляр ссылаются друг на друга, пользователь может определить захват в замыкании как неподтвержденную ссылку. Тогда он не позволит пользователю одновременно освободить экземпляр. Когда экземпляр когда-нибудь вернет значение ‘nil’, определите замыкание со слабым экземпляром.
class HTMLElement { let module: String let text: String? lazy var asHTML: () -> String = { [unowned self] in if let text = self.text { return "<\(self.module)>\(text)</\(self.module)>" } else { return "<\(self.module) />" } } init(module: String, text: String? = nil) { self.module = module self.text = text } deinit { print("\(module) the deinit()") } } var paragraph: HTMLElement? = HTMLElement(module: "Inside", text: "ARC Weak References") print(paragraph!.asHTML()) paragraph = nil
Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —