Tôi đã dành thời gian gỡ lỗi một vấn đề lạ với ARC và các chức năng dealloc tùy chỉnh.Vấn đề gỡ rối Xcode và ARC (bỏ qua dealloc)
- Tôi subclassing
NSOperation
lớp - tôi đặt khối hoàn thành cho hoạt động này
- Các hoạt động được tham chiếu bởi một tài sản mạnh mẽ của rất đối tượng phẳng (không có phương pháp, ivars tự động, hai thuộc tính mạnh mẽ) cho phép gọi đối tượng này
DataRequest
- theo tất cả các hướng dẫn khối hoàn thành chỉ sử dụng các tham chiếu yếu cho các đối tượng địa phương (bao gồm cả chính hoạt động)
- trình biên dịch cũng không phân tích giải quyết mọi vấn đề
DataRequest
giữ tham chiếu CHỈ cho hoạt động tôi tạo và bị hủy trong khối hoàn thành hoạt động. LUÔN LUÔN bị phá hủy (dealloc
luôn được thực thi)- Hoạt động của tôi có một tùy chỉnh
dealloc
. Tôi chỉ có một cuộc gọi NSLog trong đó.
... và vấn đề là:
Nếu tôi chạy theo này trong trình gỡ lỗi, breakpoint trong dealloc không bao giờ trúng, thông điệp log không bao giờ xuất hiện. Chủ yếu là tôi nghĩ rằng các hoạt động đã bị rò rỉ.
Nếu tôi chạy công cụ này, tất cả đều ổn, bảng điều khiển hệ thống in thông báo và công cụ phân bổ báo cáo hoạt động được giải phóng khỏi ảnh chụp nhanh ngăn xếp bao gồm dealloc tùy chỉnh. Không phát hiện rò rỉ.
Tôi chắc chắn 100% tôi sử dụng cùng một cài đặt trình biên dịch để gỡ lỗi và để lập hồ sơ.
Điều khó hiểu nhất ở cuối: Nếu tôi tạo phiên bản tùy chỉnh [DataRequest dealloc]
và tôi đặt self.operation = nil;
cho nó - tất cả đều hoạt động tốt ngay cả từ trình gỡ lỗi.
Có ai có gợi ý nào về tùy chọn trình liên kết trình biên dịch để thử xem sự khác biệt nào không? điều này có thể là lỗi trong các công cụ của Apple (tất cả chúng ta đang ở trong vị trí đổ lỗi cho một con cá lớn vì lỗi của chúng ta không?)
... và vâng tôi đã thử với GDB và LLDB. Kết quả là như nhau - những gì có thể cho thấy một cái gì đó.
Tôi đã cố gắng để tạo ra một mẫu tối giản nhưng nó chỉ làm việc (thực sự);)
Cảm ơn
Tôi đã thực hiện quan sát rất cơ bản ... nếu tôi chạy ứng dụng trên trình mô phỏng từ XCode (GDB hoặc LLDB), các thông điệp tường trình của tôi trong 'dealloc' sẽ không được in. Nếu tôi chỉ cần thoát khỏi trình gỡ rối và khởi động ứng dụng trực tiếp từ trình mô phỏng - Console.app hiển thị tất cả các tin nhắn. Không biên dịch không liên kết ở giữa. Lạ thật. – simpleone
... và một kết quả đơn giản hơn ... Nếu tôi chạy ứng dụng từ XCode trong phiên gỡ lỗi - dealloc không được gọi (nhật ký không được in) nếu tôi chạy ứng dụng theo cách thủ công trong trình mô phỏng và sau đó đính kèm trình gỡ lỗi .. tất cả là như mong đợi. – simpleone