Có ba phương pháp chính liên quan đến bộ nhớ: mã hóa, lưu trữtruy xuất. Nghe có vẻ đơn giản đối với con người chúng ta nhưng đôi khi những điều khủng khiếp có thể xảy ra bên trong máy tính, thiết bị di động như… rò rỉ bộ nhớ.

 

Trong bài viết này, chúng ta sẽ tìm hiểu về Chu kỳ giữ lại , Đếm tham chiếu tự động , Loại tham chiếu.

Quản lý bộ nhớ Swift

Ngôn ngữ lập trình Swift sử dụng Đếm tham chiếu tự động (ARC) để quản lý bộ nhớ ứng dụng của bạn. Mặc dù ARC tự động giải phóng bộ nhớ được sử dụng bởi các cá thể class, đôi khi bạn cần cung cấp cho ARC thêm thông tin về các mối quan hệ của class đó.

Cách thức hoạt động của ARC

Khi bạn tạo một thể hiện của một class, ARC sẽ cấp phát bộ nhớ để lưu trữ thông tin về nó. Hơn nữa, khi một phiên bản không còn cần thiết nữa, ARC sẽ giải phóng bộ nhớ đó. Nếu bạn thử sử dụng phiên bản đã xóa, rất có thể ứng dụng của bạn sẽ gặp sự cố (gây crash app).

Khi bạn gán một cá thể class cho một thuộc tính, hằng số hoặc biến, thuộc tính, hằng số hoặc biến đó sẽ tạo ra một tham chiếu mạnh (strong reference) đến cá thể đó. ARC không cho phép nó được giải phóng nếu tham chiếu mạnh đó vẫn còn hoặc số lượng tham chiếu lớn hơn 0.

Vấn đề

Giữ lại chu kỳ

Chu kỳ lưu giữ là khi hai đối tượng được giữ lại trong bộ nhớ vì cả hai đều tham chiếu lẫn nhau và ngăn cản nhau giải phóng.

Ví dụ:

class Person {
    var phone: Phone?
    deinit { print("Person is being deinitialized") }
}

class Phone {
    var owner: Person?
    deinit { print("Phone is being deinitialized") }
}
var person1: Person?
var phone1: Phone?
person1 = Person()
phone1 = Phone()
person1?.phone = phone1
phone1?.owner = person1
person1 = nil
phone1 = nil

Giải pháp

Khắc phục nhanh 2 bước

  1. Nhận biết đứa trẻ là ai
  2. Làm cho trẻ có một tham chiếu yếu (weak) hoặc không được biết (unowned) đến cha mẹ.
class Phone {
    weak var owner: Person?
    deinit { print("Phone is being deinitialized") }
}

 

Khi nào sử dụng Weak và Unowned

  • Bạn sử dụng weak khi tham chiếu có thể là con số không.
  • Bạn sử dụng unowned khi tham chiếu sẽ không bao giờ là con số không .

Bạn có thể xác định danh sách chụp trong closure. Mục đích của việc nắm bắt danh sách là thay đổi độ mạnh của các biến được chuyển vào.

Ví dụ:

// strong reference by default
[label = self.myLabel!] in
// weak reference
[weak label = self.myLabel!] in
// unowned reference
[unowned self] in
UIView.animate(withDuration: 0.3) { [weak self] in
    self?.label.alpha = 1
}

 

Tất cả các giải pháp này liên quan đến việc giảm số lượng tham chiếu bằng cách:

  • Sử dụng weak
  • Sử dụng unknowed
  • Đặt các loại tham chiếu thành nil

 

Techmaster đang liên tục khai giảng các lớp iOS Swift

Xem thêm tại đây: https://techmaster.vn/khoa-hoc/25554/lap-trinh-ios-swift-can-ban-cap-nhat-2020