2009-02-25 16 views
5

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

20

Đừ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ì.

8

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ó.

43

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]; 
} 
+0

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

+5

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

+0

Ý tưởng tuyệt vời. Cảm ơn! – mtrc

1

Đâ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

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