Tôi có một UIViewController có số lần giữ lại là 3 thời điểm tôi khởi tạo nó. Điều đó khuấy động tôi một cách khủng khiếp không chính xác. Cách tốt nhất để tìm ra những người đã tăng số tiền giữ lại lên 3 là bao nhiêu? Tôi muốn tưởng tượng instantiating đối tượng nên cung cấp cho con trỏ 1, sau đó tôi cho rằng có thể đẩy nó vào ngăn xếp của UINavigationController có thể bump nó lên một (không chắc chắn về điều đó mặc dù?), Nhưng thứ ba .. là một bí ẩn.Tìm người có số lần giữ lại đối tượng
Trả lời
Đừng bao giờ dựa vào số lần giữ lại trực tiếp. Điều xảy ra là trong quá trình khởi tạo, một số đoạn mã có một đối tượng là retain
ed và autorelease
. Vì bạn không thể biết số lần một đối tượng là autorelease
d, bạn thực sự không biết số lượng giữ lại thực là là gì.
Số lượng giữ lại chỉ được sử dụng làm trợ giúp gỡ lỗi, không bao giờ làm luồng kiểm soát chương trình.
Miễn là bạn tuân theo tất cả các quy tắc được nêu trong Memory Management Programming Guide for Cocoa, bạn sẽ không gặp vấn đề gì.
Cách tốt nhất để tìm ra ai đã tăng số người giữ lạiCount to 3?
Đó là tiếp cận vấn đề từ góc sai. Điều này sẽ gây nhầm lẫn cho bạn và sẽ dẫn bạn lạc lối (và có thể là quá khứ) vấn đề thực tế, khi thực sự có một vấn đề.
Tốt hơn để suy nghĩ về người sở hữu đối tượng. Bạn có ý định giữ đối tượng xung quanh là giá trị của một trong các thuộc tính của riêng bạn không? Nếu vậy, thì bạn là một trong những chủ nhân của nó. Nếu không, thì bạn thì không. Nếu bạn truyền đối tượng cho đối tượng khác để lưu trữ trong một thuộc tính của nó, thì đối tượng kia cũng là chủ sở hữu.
Những chủ sở hữu này chỉ là mối quan hệ, do đó, thật dễ dàng để giữ chúng thẳng trong đầu bạn.
- “Đây là một trong các bộ điều khiển của tôi. Nó sở hữu các đối tượng gốc của mô hình của tôi và một hoặc nhiều khung nhìn [controller] s. ”
- “ Đây là chế độ xem. Nó sở hữu một số phần của mô hình của tôi. ”
- “ Đây là một phần của mô hình của tôi. Nó chỉ sở hữu các vật thể nguyên thủy. ”
- “ Đây là một phần khác của mô hình của tôi. Nó sở hữu một số đối tượng nguyên thủy và một số bit khác của mô hình.”
Nếu bạn có một nền tảng vững chắc của quyền sở hữu của bạn, sau đó bạn không thể viết một rò rỉ bộ nhớ trừ bằng cách quên đi một release
hoặc autorelease
tin nhắn (có thể xảy ra cho bất kỳ ai), và bạn gần như chắc chắn sẽ không viết một lưu giữ theo chu kỳ (hai đối tượng giữ lại lẫn nhau) ngoại trừ cố ý và với các nhận xét dồi dào và #warnings.
Nếu bạn chưa từng làm việc với chủ sở hữu của mình, thì có thể bạn đã viết một hoặc nhiều rò rỉ bộ nhớ hoặc các lần lưu ý theo chu kỳ mà bạn không biết.
Edit: Và để trả lời câu hỏi thực tế, cách tốt nhất để tìm ra những gì đã giữ lại và, có thể, sau đó autoreleased-một đối tượng là để sử dụng phân bổ cụ của cụ. Với nó, bạn có thể xem lịch sử của bất kỳ đối tượng nào để xem mọi phân bổ, giữ lại, tự động phát hành, giải phóng và giải quyết địa chỉ của nó.
Adam đúng rằng bạn không nên quá lo ngại về số lần giữ lại. Nhưng nếu bạn có nhu cầu hợp pháp để giải quyết một bí ẩn như vậy, một kỹ thuật tốt là phân lớp lớp bị ảnh hưởng chỉ để bạn có thể thêm phần ghi đè vào các phương thức quản lý bộ nhớ.
Ví dụ: trong một lớp con của UIViewController, bạn có thể triển khai:
- (id) retain
{
// Break here to see who is retaining me.
return [super retain];
}
Đây không phải là giải pháp 100%, nhưng LLVM Clang Static Analyzer có thể giúp bạn theo dõi việc sử dụng quản lý bộ nhớ không chính xác. Giữa Analyzer tĩnh và MallocDebug, bạn có thể trở thành một chuyên gia trong việc theo dõi vấn đề quản lý bộ nhớ rất nhanh chóng. BTW, mặc dù Instruments là sự nóng bỏng mới, tôi thấy MallocDebug đáng tin cậy hơn nhiều.
Bạn có thể tìm Analyzer LLVM Clang tĩnh ở đây: LLVM/Clang Static Analyzer
- 1. Đếm số lần dọn dẹp GC trên một đối tượng
- 2. NSURLConnection có giữ lại người được ủy quyền không?
- 3. Bạn nghĩ gì về mã này trong Mục tiêu-C làm tăng số lần giữ lại của thorugh và gọi mỗi lần lặp lại?
- 4. Có thể cho nhiều đối tượng giữ lại cùng một đối tượng trong Objective-C/Cocoa không?
- 5. Lặp lại đối tượng danh sách n lần
- 6. Tại sao ARC giữ lại các đối số phương thức?
- 7. lỗi: thuộc tính 'myBoolVariableName' có thuộc tính 'giữ lại' phải thuộc loại đối tượng
- 8. Không tìm thấy chú thích trên đối tượng có lưu giữ Thời gian chạy
- 9. 'Đối với mỗi' Số lần lặp lại VB.NET
- 10. GC.KeepAlive có bắt buộc ở đây hay tôi có thể dựa vào người dân địa phương và đối số để giữ một đối tượng còn sống không?
- 11. Tôi có phải giữ lại một đối tượng trước khi chuyển nó tới -performSelector: withObject: afterDelay :?
- 12. Làm thế nào để bạn tìm ra những gì đang giữ lại một đối tượng trong Dụng cụ?
- 13. Điều gì làm tăng số lượng lưu giữ của đối tượng?
- 14. Gán đối tượng được giữ lại cho thuộc tính yếu; đối tượng sẽ được phát hành sau khi phân
- 15. Trang chuyên sâu Ajax: sử dụng lại cùng một đối tượng XMLHttpRequest hoặc tạo một đối tượng mới mỗi lần?
- 16. Làm cách nào để giữ lại một đối tượng phức tạp trong Hoạt động khởi động lại?
- 17. SWIG Java giữ lại thông tin lớp của các đối tượng nảy từ C + +
- 18. Kích thước được giữ lại cho một đối tượng trên heapdump là gì?
- 19. Tại sao Convert.ChangeType lại lấy một tham số đối tượng?
- 20. Theo dõi số lượng "lượt xem trang" hoặc "lần truy cập" của một đối tượng?
- 21. sprintf - đối số lặp lại
- 22. Cách tìm nếu có các từ được lặp lại hai lần liên tiếp
- 23. Số lần lặp lại trong python?
- 24. CAAnimation -1 số lần lặp lại?
- 25. cin.clear() không đặt lại đối tượng cin
- 26. jQuery tablesorter cách tìm đối tượng sortList
- 27. Đối tượng mô hình CoreData trong ARC sử dụng giữ lại
- 28. Làm thế nào để số nhiều "Có/là N đối tượng/đối tượng"?
- 29. Gọi lại hướng đối tượng cho C++?
- 30. Nhận giữ đối tượng lớp ngoài từ đối tượng lớp bên trong
Làm thế nào bạn có thể biết ai đang giữ các đối tượng? Lập luận duy nhất là tự, phải không? – quano
quano - bạn nhìn vào dấu vết ngăn xếp từ trình gỡ lỗi. Bạn sẽ thấy chính xác ai đang gọi giữ lại. – danielpunkass
Ý tưởng tuyệt vời. Cảm ơn! – mtrc