Учебники

Свифт — Обзор ARC

Функции управления памятью и ее использование обрабатываются на языке Swift 4 с помощью автоматического подсчета ссылок (ARC). ARC используется для инициализации и деинициализации системных ресурсов, освобождая тем самым пространство памяти, используемое экземплярами класса, когда экземпляры больше не нужны. ARC отслеживает информацию об отношениях между нашими экземплярами кода для эффективного управления ресурсами памяти.

Функции АРК

  • ARC выделяет кусок памяти для хранения информации каждый раз, когда init () создает новый экземпляр класса.

  • Информация о типе экземпляра и его значениях хранятся в памяти.

  • Когда экземпляр класса больше не нужен, он автоматически освобождает пространство памяти с помощью deinit () для дальнейшего хранения и извлечения экземпляра класса.

  • ARC отслеживает в настоящее время ссылающиеся на свойства экземпляров класса, константы и переменные, так что deinit () применяется только к этим неиспользуемым экземплярам.

  • ARC поддерживает «строгую ссылку» на эти свойства экземпляра класса, константы и переменные, чтобы ограничить освобождение, когда экземпляр класса используется в настоящее время.

ARC выделяет кусок памяти для хранения информации каждый раз, когда init () создает новый экземпляр класса.

Информация о типе экземпляра и его значениях хранятся в памяти.

Когда экземпляр класса больше не нужен, он автоматически освобождает пространство памяти с помощью deinit () для дальнейшего хранения и извлечения экземпляра класса.

ARC отслеживает в настоящее время ссылающиеся на свойства экземпляров класса, константы и переменные, так что deinit () применяется только к этим неиспользуемым экземплярам.

ARC поддерживает «строгую ссылку» на эти свойства экземпляра класса, константы и переменные, чтобы ограничить освобождение, когда экземпляр класса используется в настоящее время.

Программа ARC

Live Demo

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

Live Demo

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’, мы можем указать это, используя слабую ссылку. Когда экземпляр будет возвращать что-то, а не ноль, объявите это с неизвестной ссылкой.

Слабая справочная программа

Live Demo

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

Неизвестная справочная программа

Live Demo

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 ()». Сильные опорные циклы используются в качестве опорных типов для замыканий.

Live Demo

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’, определите замыкание со слабым экземпляром.

Live Demo

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

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —