+ Đều dùng để giải quyết vấn đề memory leak khi có tham chiếu vòng (reference cycle), bằng cách không tăng thêm reference count ở instance mà có instance khác tham chiếu đến. + Một tham chiếu weak luôn luôn là optional và tự động nil khi đối tượng bị deinit. Chính vì vậy khi khai báo biến weak ta phải dùng var (biến có thể thay đổi đc), không thì sẽ bị báo lỗi.

+ Ngược lại, tham chiếu unowned luôn dùng cho 1 đối tượng không thay đổi được, nên khi khai báo ta sẽ phải dùng let. + unowned thường được dùng khi life time của instance này lớn hơn hoặc bằng so với instance còn lại.

Vì sao phải có unowned?

Thực tế nếu bạn chỉ dùng weak thôi thì bài toán memory leak đều có thể giải quyết được. Có thêm unowned là để phân biệt rõ ràng giữa let và var, giữa biến thay đổi được và biến không thay đổi được. Đảm bảo sự hợp lý khi thiết kế class.

Ví dụ:

  • Một người dùng User sẽ có thể có 1 hoặc nhiều điện thoại, và 1 chiếc điện thoại có thể từng trải qua sự sở hữu của một hoặc nhiều người khác nhau. Lúc này ta sẽ dùng tham chiếu weak cho đối tượng user nằm trong class Phone.
  • Một người dùng User có thể có nhiều hợp đồng thuê nhà, nhưng mỗi hợp đồng thuê nhà thì chỉ có 1 người duy nhất ký vào, không thể chuyển nhượng hợp đồng này cho người khác. Trường hợp này ta sẽ dùng unowned cho đối tượng user trong class HouseLease.