2012-06-21 32 views
5

Tôi có câu hỏi nhanh về ARC trong iOS. (Xin lỗi tôi đã hỏi rất nhiều loại câu hỏi này, nhưng tôi chỉ lo ngại về quản lý bộ nhớ). Điều quan trọng cần lưu ý là tôi chưa bao giờ sử dụng hệ thống bảo trì bộ nhớ cũ (retain, release, assign ... vv) vì vậy tôi không thực sự biết ý nghĩa của các thuật ngữ đó.Khi nào các thuộc tính mạnh được phát hành trong ARC trong iOS?

Ngay bây giờ tôi đang bối rối về những gì tôi phải làm để đảm bảo rằng các thuộc tính mạnh mẽ được phát hành đúng cách. Ví dụ: giả sử tôi đang tạo ứng dụng dành cho trường học và đối tượng School của tôi chứa tham chiếu thuộc tính mạnh mẽ đến 5 đối tượng Child khác nhau (không nằm trong mảng). Mỗi đối tượng Child có một con trỏ (thuộc tính) mạnh đến đối tượng Book.

Nếu tôi xóa một trong số Child đối tượng khỏi trường học của tôi (nói bằng cách tạo thuộc tính = nil hoặc bằng cách thay đổi thuộc tính của tôi để trỏ vào một đối tượng mới), Book của nó có được phát hành đúng cách không? Tôi phải làm gì để đảm bảo rằng đây là trường hợp? Tôi có cần phải viết self.myBook = nil theo phương thức dealloc không? Điều gì xảy ra nếu Child là một Trình điều khiển Chế độ xem, tôi có cần phải viết self.myBook = nil trong phương thức viewDidUnload không?

Tôi chỉ nhắm mục tiêu iOS 5 (trở lên) nên cách quản lý bộ nhớ cũ không thực sự quan trọng đối với tôi.

+0

Tôi khuyên bạn nên đọc: http://clang.llvm.org/docs/AutomaticReferenceCounting.html –

+0

Cảm ơn bạn đã đề xuất. Tôi sẽ xem xét nó. – Nosrettap

Trả lời

5

Nếu tôi loại bỏ một trong những Child đối tượng từ trường học của tôi (nói bằng cách làm cho nó property = nil, hoặc bằng cách thay đổi sở hữu của tôi để trỏ vào một đối tượng mới), sẽ nó Book được phát hành đúng cách?

Có, nó sẽ được phát hành miễn là không có tham chiếu mạnh mẽ nào khác.

Tôi phải làm gì để đảm bảo rằng đây là trường hợp?

Không có gì đặc biệt: ARC sẽ giảm giá trị đếm tham chiếu đối tượng của khi bạn thiết lập các tham chiếu đến đối tượng để nil, thấy rằng đối tượng không còn được tham chiếu, và tiến tới xóa nó. Đó là đủ thông minh để đối phó với các mục được tham chiếu từ đối tượng bị xóa, đệ quy, do đó bạn sẽ không bị rò rỉ bất kỳ bộ nhớ nào.

Một điều bạn phải lo lắng về là tham chiếu vòng tròn: nếu Book của bạn có một back-tài liệu tham khảo mạnh để Child, hoặc là làm cho điều đó tham khảo weak, hoặc rõ ràng nó ra cùng một lúc như bạn thiết lập tham chiếu của Book-nil (tùy chọn thứ hai là dễ bị lỗi, và do đó không được khuyến khích).

+0

Bạn có thể nói rằng hầu hết thời gian, thời gian duy nhất để sử dụng 'tính chất yếu' là cho các cửa hàng và tránh phụ thuộc vòng tròn? – Nosrettap

+0

@Nosrettap Tránh tham chiếu vòng tròn và ở một mức độ nào đó, bộ nhớ đệm, là hai "trường hợp ô" bao gồm việc sử dụng các thuộc tính yếu. Một trường hợp đặc biệt quan trọng đáng nói đến riêng biệt là các thuộc tính đại diện cho các đại biểu: với ngoại lệ đáng chú ý là 'CAAnimation', tất cả các thuộc tính ủy nhiệm đều yếu để tránh tạo ra các chu kỳ lưu giữ. – dasblinkenlight

+0

Nếu có chu kỳ tham chiếu, anh ta không thể 'xóa nó trong -dealloc', bởi vì dealloc sẽ không bao giờ được gọi! (Trừ khi đó là dealloc của một phương thức sở hữu cả hai thành viên của chu kỳ) –

Các vấn đề liên quan