2012-02-04 38 views
10

Tôi đã chuyển một số mã cũ sang mục tiêu-C ARC (Tự động tham chiếu) và dường như nó hoạt động tốt. Ngoại trừ một đối tượng cấp cao, khá lớn không bị phân phối khi nó được bật ra khỏi ngăn xếp điều hướng của tôi, khiến tôi tin rằng tôi có chu kỳ giữ chân ở đâu đó mà ARC đã ẩn khỏi tôi (hoặc ít nhất là khó theo dõi). Cách tốt nhất để loại bỏ chu trình giữ lại tiềm năng này là gì và/hoặc cách tốt nhất để xác định nguyên nhân rò rỉ bộ nhớ trong ARC là gì? Cảm ơn!Phát hiện giữ lại vòng tròn ARC

Trả lời

16

Cách tốt nhất thường là sử dụng the Leaks instrument in the Instruments app.

Các Có gì mới Trong Instruments video từ WWDC 2011 thảo luận về sử dụng dụng cụ để tìm giữ lại chu kỳ dưới ARC, bắt đầu khoảng 38 phút trong.

+0

vẻ như tôi đã tìm thấy nó! Đã có một tham chiếu khối được __unsafe_unretained; thay đổi nó thành __weak __block cho lols và dường như đã sửa nó. LƯU Ý: Dụng cụ DID KHÔNG TÌM KIẾM NÀY và thực sự không đánh dấu điều này là một tình huống rò rỉ tiềm tàng. Cảm ơn bạn đã đề xuất! – Grimless

+0

Rất tiếc, sau khi thêm một số lần đào, hóa ra lỗ rò vẫn còn xung quanh. Nhưng nó chỉ rò rỉ khi tôi đẩy nó vào ngăn xếp chuyển hướng ... Nếu tôi sử dụng -init hoặc -initWithNibName: bundle :, và sau đó nil nó là tài liệu tham khảo, nó deallocates một cách chính xác. Nếu không, khi tôi đẩy nó trên một ngăn xếp chuyển hướng và sau đó bật nó, nó không bao giờ deallocates. – Grimless

26

Tôi chỉ chuyển một ứng dụng cũ để sử dụng ARC. Dụng cụ cho thấy không có rò rỉ, nhưng phân bổ tiếp tục đi lên. Tôi thấy rằng bằng cách nhìn vào các vật thể trực tiếp cho một thứ mà tôi biết sẽ bị xóa, tôi đã có thể theo dõi những thứ còn lại mà không có một bản phát hành. Dưới đây là các bước cơ bản:

  1. Sử dụng công cụ phân bổ trong Instruments
  2. Chơi với ứng dụng của bạn trong một thời gian (nếu bạn biết những gì không được phát hành, điều này đi nhanh hơn)
  3. Change kê to Objects trong thanh nhảy Phân bổ
  4. Sắp xếp theo loại và tìm ra tên lớp của đối tượng chưa được phát hành của bạn
  5. Tìm một ví dụ sống và nhấp vào mũi tên nhỏ ngay bên cạnh địa chỉ bộ nhớ
  6. Bây giờ bạn có thể xem lịch sử tái tains và phát hành cho một đối tượng

Screenshot of object history in Instruments

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