ARC chỉ chơi giữ lại / phát hành cũ (MRC) với trình biên dịch để tìm ra khi nào cần gọi giữ lại / phát hành. Nó sẽ có xu hướng có hiệu năng cao hơn, sử dụng bộ nhớ tối đa thấp hơn và hiệu suất dễ dự đoán hơn so với hệ thống GC.
Mặt khác, một số loại cấu trúc dữ liệu là không thể với ARC (hoặc MRC), trong khi đó, GC có thể xử lý chúng.
Ví dụ, nếu bạn có một lớp có tên là nút và nút có NSArray của trẻ em và một tham chiếu duy nhất đến cha mẹ của nó là "chỉ hoạt động" với GC. Với ARC (và tính tham chiếu thủ công cũng vậy), bạn có một vấn đề. Bất kỳ nút cho trước sẽ được tham chiếu từ con của nó và cũng từ cha mẹ của nó.
Giống:
A -> [B1, B2, B3]
B1 -> A, B2 -> A, B3 -> A
Tất cả đều ổn trong khi bạn đang sử dụng A (nói thông qua một biến cục bộ).
Khi bạn hoàn thành nó (và B1 / B2 / B3), một hệ thống GC cuối cùng sẽ quyết định xem xét mọi thứ mà nó có thể tìm thấy bắt đầu từ các thanh ghi ngăn xếp và CPU. Nó sẽ không bao giờ tìm thấy A, B1, B2, B3 vì vậy nó sẽ hoàn thiện chúng và tái chế bộ nhớ thành các đối tượng khác.
Khi bạn sử dụng ARC hoặc MRC và kết thúc với A, nó có tổng số 3 (B1, B2 và B3 đều tham chiếu đến nó) và B1 / B2 / B3 đều có số tham chiếu là 1 (NSArray của A giữ một tham chiếu đến mỗi). Vì vậy, tất cả những vật thể đó vẫn tồn tại mặc dù không có gì có thể sử dụng chúng.
Giải pháp chung là quyết định một trong những tài liệu tham khảo đó cần phải yếu (không đóng góp vào số tham chiếu). Điều đó sẽ hoạt động đối với một số mẫu sử dụng, ví dụ: nếu bạn tham chiếu B1 / B2 / B3 chỉ qua A. Tuy nhiên trong các mẫu khác thì không thành công. Ví dụ: nếu đôi khi bạn sẽ giữ B1 và mong đợi trèo lên thông qua con trỏ cha và tìm A. Với tham chiếu yếu nếu bạn chỉ giữ B1, A có thể (và thường sẽ) bay hơi, và lấy B2 và B3 với nó.
Đôi khi điều này không phải là một vấn đề, nhưng một số cách làm việc rất hữu ích và tự nhiên với các cấu trúc dữ liệu phức tạp rất khó sử dụng với ARC / MRC.
Vì vậy, ARC nhắm mục tiêu cùng loại vấn đề mục tiêu GC. Tuy nhiên ARC hoạt động trên một tập các mẫu sử dụng hạn chế hơn sau đó là GC, vì vậy nếu bạn lấy ngôn ngữ GC (như Java) và ghép một cái gì đó như ARC lên nó, một số chương trình sẽ không hoạt động nữa (hoặc ít nhất sẽ tạo ra hàng tấn bộ nhớ bị bỏ rơi và có thể gây ra sự cố tráo đổi nghiêm trọng hoặc hết bộ nhớ hoặc trao đổi dung lượng).
Bạn cũng có thể nói ARC đặt ưu tiên lớn hơn cho hiệu suất (hoặc có thể dự đoán được) trong khi GC đặt ưu tiên lớn hơn là một giải pháp chung. Kết quả là GC có nhu cầu CPU / bộ nhớ ít dự đoán hơn và hiệu suất thấp hơn (thông thường) so với ARC, nhưng có thể xử lý bất kỳ kiểu sử dụng nào. ARC sẽ hoạt động tốt hơn nhiều đối với nhiều mẫu sử dụng phổ biến, nhưng đối với một vài mẫu sử dụng (hợp lệ!), Nó sẽ bị đổ và chết.