Swift - ARC'ye Genel Bakış

Bellek yönetimi işlevleri ve kullanımı, Otomatik referans sayma (ARC) aracılığıyla Swift 4 dilinde ele alınır. ARC, sistem kaynaklarını başlatmak ve yeniden başlatmak, böylece örneklere artık ihtiyaç duyulmadığında sınıf örnekleri tarafından kullanılan bellek alanlarını serbest bırakmak için kullanılır. ARC, bellek kaynaklarını etkin bir şekilde yönetmek için kod örneklerimiz arasındaki ilişkiler hakkındaki bilgileri izler.

ARC'nin İşlevleri

  • ARC, init () tarafından yeni bir sınıf örneği oluşturulduğunda her seferinde bilgileri depolamak için bir bellek parçası ayırır.

  • Örnek türü ve değerleri hakkındaki bilgiler bellekte saklanır.

  • Sınıf örneğine artık ihtiyaç kalmadığında, daha fazla sınıf örneği depolama ve geri alma için bellek alanını deinit () ile otomatik olarak serbest bırakır.

  • ARC, deinit () yalnızca kullanılmayan örneklere uygulanacak şekilde, şu anda başvuruda bulunan sınıf örneklerinin özelliklerini, sabitlerini ve değişkenlerini izler.

  • ARC, sınıf örneği şu anda kullanımda olduğunda serbest bırakmayı kısıtlamak için bu sınıf örneği özelliğine, sabitlerine ve değişkenlerine 'güçlü bir başvuru' sağlar.

ARC Programı

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)

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Swift 4
98

ARC Güçlü Referans Döngüleri Sınıf Örnekleri

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Initializing: Swift 4
Initializing: ARC

ARC Zayıf ve Sahipsiz Referanslar

Sınıf türü özelliklerinin güçlü referans döngülerini çözmenin iki yolu vardır -

  • Zayıf Referanslar
  • Sahipsiz Referanslar

Bu referanslar, bir örneğin bir referans döngüsündeki diğer örneklere başvurmasını sağlamak için kullanılır. Daha sonra örnekler, güçlü referans döngüsünü önemsemek yerine her bir örneğe başvurabilir. Kullanıcı bazı örneklerin 'nil' değerleri döndürebileceğini bildiğinde, bunu zayıf referans kullanarak gösterebiliriz. Örnek nil yerine bir şey döndürecekse, onu sahipsiz referansla bildirin.

Zayıf Referans Programı

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

ARC Is The Main Module
Sub Module with its topic number is 4

Sahipsiz Referans Programı

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

ARC
Marks Obtained by the student is 98

Kapanışlar için Güçlü Referans Döngüleri

Belirli bir örneği yakalamak için sınıf örneği özelliğine ve kapanışın gövdesine bir closure atadığımızda güçlü referans döngüsü oluşabilir. Kapanışa güçlü referans, 'self.someProperty' veya 'self.someMethod ()' ile tanımlanır. Kapaklar için referans türleri olarak güçlü referans döngüleri kullanılır.

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())

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

<p>Welcome to Closure SRC</p>

Zayıf ve Sahipsiz Referanslar

Kapanış ve örnek birbirine atıfta bulunduğunda, kullanıcı bir kapanıştaki yakalamayı sahipsiz bir referans olarak tanımlayabilir. Daha sonra, kullanıcının aynı anda örneği serbest bırakmasına izin vermez. Örnek bazen bir 'nil' değeri döndürdüğünde, kapanışı zayıf örnekle tanımlayın.

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

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

<Inside>ARC Weak References</Inside>
Inside the deinit()