Weak và unowned được sử dụng để xử lý memory leak và retain cycle trong lập trình iOS . Bản chất chung của cả 2 đó là đều không làm tăng reference count.

Có một thực tế là weak được sử dụng phổ biến hơn là unowned, lý do là bởi vì không ai muốn phá vỡ cấu trúc code của mình, cũng như phải suy nghĩ hai lần. Và tôi cũng tương tự khi có một project mà không hề có một từ unowned nào cả.

Gần đây, tôi có dịp được học hỏi và tìm hiểu sâu hơn về hai khái niệm này, và sau đó phát hiện ra weak và unowned rất đơn giản và dễ sử dụng khi mà chúng ta biết cách và lựa chọn thời điểm để sử dụng chúng. 

Unwoned

Khi sử dụng unowned chúng ta cần lưu ý một điều quan trọng như sau: 
· Bạn có thể sử dụng unowned khi instance này có tuổi đời lớn hơn hoặc bằng so với instance còn lại.  

Để dễ hình dung thì chúng ta lấy ví dụ về 2 đối tượng Khách hàng (Customer) và Thẻ tín dụng (Credit Card), thẻ tín dụng không thể tồn tại nếu không có chủ thẻ, tức là khách hàng. Do vậy instance của Thẻ tín dụng cũng không thể tồn tại nếu như instance của Khách hàng bị hủy.  Và chúng ta chỉ có thể khởi tạo CreditCard instance bằng cách truyền Customer instance vào trong hàm init(). 

khi mà customer = nil, cả Customer và Credit Card đều bị deallocate.

Khi ở trong closure, unowned đóng vai trò như một biến unwrapped optionals. Do vậy khi dùng trong closure, chúng ta không cần phải sử dụng optional chain và cũng không cần phải unwrap instance đó. 

Weak 

weak sẽ làm nulll con trỏ mỗi khi reference bị deallocate nhưng unowned thì không. Vì weak cần phải cho phép giá trị của biến trở thành nil tại runtime, do vậy chúng ta thường khai báo biến thành kiểu var và optional. 

Khi ở trong closure, tham chiếu weak sẽ hoạt động như một kiểu optional, do vậy trái với unowned, bạn phải dùng optional chain.

Chắc hẳn các bạn đã từng thắc mắc về hai khái niệm [weak self] và [unowned self]  trong closure. Đây được gọi là CaptureList,dấu ngoặc vuông chúng ta thấy đây là một capture list, một array, với weak self là đối tượng duy nhất ở bên trong, vì bản chất là một array, capture list có thể capture nhiều đối tượng bên trong theo như ý bạn muốn:

Hy vọng sau bài viết này các bạn sẽ có được hiểu được bản chất và cách sử dụng hai khái niệm trên.

Khóa học lập trình di động tại Techmaster:

Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:

  • Nguyễn Minh Sơn: 01287065634
  • Huỳnh Minh Sơn: 0936225565
  • Website: caidatmacos.com