2011-11-29 31 views
10

Tôi đã thử sử dụng công cụ rò rỉ và "phân tích" v.v ... để tìm rò rỉ, nhưng không thể tìm thấy nó. Sử dụng phân bổ Tôi có thể xác định các đối tượng không được phát hành.Làm cách nào để xác định đối tượng nào chứa tham chiếu đến các đối tượng khác đang gây rò rỉ bộ nhớ trong mục tiêu-c?

Tôi đã nhận thấy (bằng cách thêm các câu lệnh gỡ lỗi trong phương thức dealloc), dealloc đó không được gọi cho các đối tượng này.

Làm cách nào để xác định đối tượng nào đang giữ tham chiếu đến các đối tượng này và ngăn chúng được phát hành?

+0

Đối tượng không "giữ" tham chiếu. Thay vào đó, số lượng tham chiếu được tăng lên bằng các phương thức. –

+0

Bạn nói đúng. Tôi có nghĩa là tôi đã cố gắng để xác định các đối tượng không giảm số lượng giữ lại khi chúng được thực hiện với các đối tượng khác .. – xcoder

Trả lời

2

Công cụ phân tích không thể phát hiện sự cố. Sử dụng công cụ phân bổ để nắm bắt tất cả số lượng tham chiếu là khởi đầu, nhưng có quá nhiều lớp tôi không nhận ra hoặc truy cập trực tiếp, tôi không thể theo dõi vấn đề bằng phương pháp này. Thay vào đó, tôi lập danh sách các lớp học mà tôi chịu trách nhiệm trực tiếp và điều tra từng lớp học theo từng dòng cho đến khi tôi tìm ra được các vấn đề. Nguyên nhân là tôi đã sử dụng một số thư viện của bên thứ ba mà không làm giảm số lượng lưu giữ của một số đối tượng của tôi như mong đợi. Tôi đoán trong trường hợp này, theo nguyên tắc kỹ thuật phần mềm tốt hơn/các mẫu thiết kế và việc xem xét mã kỹ lưỡng có thể đã bắt gặp vấn đề trước đó.

+2

Đúng, thực hành mã hóa cẩn thận và xem xét mã triệt để là những cách tốt nhất để nắm bắt hầu hết các lỗi này (và nhiều lỗi khác). –

+0

Có. Tôi tin rằng người ta nên sử dụng phương pháp mà bạn đã đề cập TRƯỚC KHI sử dụng công cụ phân tích. Việc kiểm tra lại mã của riêng bạn dễ dàng hơn nhiều để đảm bảo vấn đề không có ở đó trước khi phân tích. – braden

1

Tôi sẽ bắt đầu bằng cách xây dựng và phân tích dự án (Shift Command B trong IDE).

+0

Tôi đã thử điều này, nhưng "phân tích" đôi khi không tìm thấy nó. – xcoder

1

Bạn có thể quá tải lưu giữ/giải phóng/triển khai tự động trong các lớp có vấn đề (nếu đó là lớp SDK, có thể sử dụng danh mục) và đặt điểm ngắt tại đó. Breakpoint của bạn sẽ được nhấn mỗi khi một cái gì đó giữ lại đối tượng của bạn.

+0

Đây là một giải pháp tuyệt vời nếu mã hóa cẩn thận và xem xét THEN phân tích vẫn không cung cấp cho bạn câu trả lời. – braden

11

Nếu bạn cần để xem nơi giữ, phát hành và autoreleases xảy ra đối với một công cụ sử dụng đối tượng:

Run trong các văn bản, trong phân bổ thiết lập "đếm tham khảo Ghi" trên trên (bạn phải ngừng việc ghi hình để thiết lập các tùy chọn). Làm cho bộ chọn chạy, dừng ghi âm, tìm kiếm có ivar (datePickerView), xem chi tiết và bạn sẽ có thể thấy tất cả nơi lưu giữ, phát hành và tự động phát hiện xảy ra.

enter image description here

+0

Ý tưởng hay. Tôi đã làm điều đó. Tôi thấy thật khó để theo dõi ai đang nắm giữ nó vì có quá nhiều lớp mà tôi không nhận ra, hoặc truy cập trực tiếp. Cuối cùng tôi vừa tạo ra một danh sách các lớp tôi biết trực tiếp truy cập vào đối tượng của tôi, và xem xét từng cái một. – xcoder

+7

Đối với bất cứ ai tự hỏi, tùy chọn "Ghi lại số lượng tham chiếu" được ẩn đằng sau 'i' bên cạnh 'Phân bổ' trong ngăn bên trái http://snag.gy/F39G0.jpg – yonilevy

+0

Không thể nâng cấp đủ điều này! Cảm ơn rất nhiều. –

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