Vấn đề chính liên quan đến bộ nhớ mà bạn vẫn cần phải biết là giữ lại các chu kỳ. Điều này xảy ra khi một đối tượng có một con trỏ mạnh đến một đối tượng khác, nhưng đối tượng đích có một con trỏ mạnh trở lại ban đầu. Ngay cả khi tất cả các tham chiếu khác đến các đối tượng này bị xóa, chúng vẫn sẽ giữ cho nhau và sẽ không được phát hành. Điều này cũng có thể xảy ra một cách gián tiếp, bởi một chuỗi các đối tượng có thể có đối tượng cuối cùng trong chuỗi liên quan đến một đối tượng trước đó.
Vì lý do này mà các vòng loại __unsafe_unretained
và __weak
quyền sở hữu tồn tại. Cái trước sẽ không giữ lại bất kỳ đối tượng nào mà nó trỏ tới, nhưng để ngỏ khả năng vật thể đó sẽ biến mất và nó chỉ vào bộ nhớ xấu, trong khi cái sau không giữ lại đối tượng và tự động đặt nó thành con số không khi mục tiêu của nó bị phá hủy. Trong số hai, __weak
thường được ưa thích trên các nền tảng hỗ trợ nó.
Bạn sẽ sử dụng các vòng loại này cho những thứ như đại biểu, nơi bạn không muốn đối tượng giữ lại đại biểu của mình và có khả năng dẫn đến một chu kỳ.
Một vài mối quan tâm liên quan đến bộ nhớ quan trọng khác là việc xử lý các đối tượng và bộ nhớ Core Foundation được phân bổ sử dụng malloc()
cho các loại như char*
. ARC không quản lý các loại này, chỉ các đối tượng Objective-C, do đó bạn sẽ vẫn cần phải tự xử lý chúng. Các loại Core Foundation có thể đặc biệt khó khăn, bởi vì đôi khi chúng cần được bắc cầu để khớp với các đối tượng Objective-C và ngược lại. Điều này có nghĩa là điều khiển cần phải được chuyển qua lại từ ARC khi kết nối giữa các loại CF và Objective-C. Một số từ khóa liên quan đến việc bắc cầu này đã được thêm vào và Mike Ash có một mô tả tuyệt vời về các trường hợp bắc cầu khác nhau trong bài viết ARC dài của mình .
Ngoài ra, có một số trường hợp khác ít gặp hơn, nhưng vẫn có khả năng có vấn đề, mà đặc điểm kỹ thuật được công bố đi vào chi tiết.
Phần lớn hành vi mới, dựa trên việc giữ các đối tượng xung quanh miễn là có một con trỏ mạnh với chúng, rất giống với bộ sưu tập rác trên máy Mac. Tuy nhiên, nền tảng kỹ thuật rất khác nhau. Thay vì có một quy trình thu gom rác chạy đều đặn để dọn dẹp các đối tượng không còn bị chỉ ra, phong cách quản lý bộ nhớ này dựa trên các quy tắc lưu giữ / giải phóng cứng nhắc mà tất cả chúng ta cần phải tuân thủ trong Objective-C.
ARC chỉ đơn giản thực hiện các tác vụ quản lý bộ nhớ lặp đi lặp lại mà chúng ta phải thực hiện trong nhiều năm và chuyển chúng sang trình biên dịch để chúng ta không bao giờ phải lo lắng về chúng nữa. Bằng cách này, bạn không gặp phải sự cố tạm dừng hoặc cấu hình bộ nhớ răng cưa gặp phải trên nền tảng thu gom rác. Tôi đã trải nghiệm cả hai thứ này trong các ứng dụng Mac đã thu thập rác của mình và rất háo hức muốn xem cách chúng hoạt động theo ARC.
Để biết thêm về bộ sưu tập rác so với ARC, hãy xem phản hồi rất thú vị này của Chris Lattner trên danh sách gửi thư Objective-C , nơi anh liệt kê nhiều lợi thế của ARC so với bộ sưu tập rác Objective-C 2.0. Tôi đã gặp một số vấn đề về GC mà anh ấy mô tả.