NSZombie là gì?


97

Tôi đã thấy các đề xuất nói rằng đặt NSZombieEnabledthành truetrong khi gỡ lỗi. NSZombie là gì? Nó là một khuôn khổ? Một thiết lập?


18
Một NSObject undead - hãy cẩn thận!
vikingosegundo

5
Một * undead NSObject.
Alex Zavatone

Câu trả lời:


191

Đó là một công cụ hỗ trợ gỡ lỗi bộ nhớ. Cụ thể, khi bạn đặt NSZombieEnabledthì bất cứ khi nào một đối tượng đạt đến số giữ lại 0, thay vì được định vị, nó sẽ tự biến hình thành một NSZombiethể hiện. Bất cứ khi nào một thây ma như vậy nhận được một tin nhắn, nó sẽ ghi lại một cảnh báo thay vì bị rơi hoặc hoạt động theo cách không thể đoán trước. Do đó, bạn có thể gỡ lỗi các sự cố tinh vi khi phát hành quá mức / tự động khôi phục mà không cần các công cụ nâng cao hoặc tìm kiếm vất vả.

Cái tên này là một cách chơi khá rõ ràng về thực tế là các vật thể thường được coi là "chết" khi chúng đạt đến số lượng duy trì là 0. Với thiết lập này, chúng tiếp tục tồn tại trong một chu kỳ bán rã kỳ lạ - không sống, cũng không chết. Giống như những thây ma thực sự, ngoại trừ chúng ăn ít não hơn.


61
Hãy cẩn thận xóa cài đặt này khi bạn đã gỡ lỗi xong vì về cơ bản nó làm rò rỉ mọi đối tượng.
Justin

1
Cảm ơn vì lời giải thích đơn giản này. Hãy thông báo rằng Cocoa Dev Link không còn hoạt động nữa. +1 cho ngắn gọn và trọng tâm.
CRDave

95

Adam đã làm rất tốt khi giải thích Zombies là gì, nhưng sử dụng biến môi trường không phải là cách tốt nhất để tìm và theo dõi chúng.

Một cách tiếp cận tốt hơn nhiều để phát hiện zombie, chỉ là sử dụng Instruments - từ XCode, hãy bắt đầu bằng "Run with Instrument" và chọn "Allocations".

Sau đó dừng ghi ngay sau khi bắt đầu, nhấn nút "i" trên công cụ Phân bổ và bật "bật số lượng tham chiếu" và "Bật phát hiện NSZombie". Bây giờ, hãy nhấn Ghi lại trong công cụ và ứng dụng của bạn sẽ khởi động - nếu có bất kỳ đối tượng zombie nào được gửi đi, quá trình ghi âm sẽ dừng lại và một hộp thoại sẽ bật lên trong dòng thời gian ghi - bạn có thể nhấp vào đó để tìm mọi vị trí mà đối tượng đã ở. giữ lại hoặc phát hành.

Chỉnh sửa: Lời khuyên trước đây dành cho XCode 3, đây là phần bổ sung cho XCode 4:

Trong XCode 4.2 , có một cơ chế thậm chí còn dễ dàng hơn để sử dụng phát hiện Zombie - Công cụ Zombie. Thay vì "Chạy" để khởi động ứng dụng, hãy sử dụng "Hồ sơ" và một bộ chọn công cụ sẽ xuất hiện. Chọn "Zombie", và ứng dụng sẽ bắt đầu chạy - làm bất cứ điều gì gây ra sự cố của bạn, một hộp thoại sẽ bật lên với nội dung "Zombie Messaged".

Từ đó, nhấp vào mũi tên nhỏ trong hộp thoại. Điều đó sẽ đưa đến danh sách tất cả các lần đối tượng zombie đó được tạo, giữ lại hoặc phát hành. Kéo thanh bên lên và bạn có thể đi tới từng mục nhập, nhìn vào dấu vết ngăn xếp để tìm mã chịu trách nhiệm cho mỗi lần điều chỉnh trong số lượng giữ lại.


2
Đây là lời khuyên vô cùng hữu ích.
w.donahue

4
Tôi đã cập nhật câu trả lời cho XCode 4 vì nó giúp phát hiện Zombie trong Dụng cụ thậm chí còn dễ dàng hơn.
Kendall Helmstetter Gelner

Không thực sự, nên làm việc khá nhiều việc cùng với XCode 5 và 6.
Kendall Helmstetter Gelner

2
Tôi cũng có thể xác nhận điều đó với XCode 7.2
Đánh bại

31

Tôi đồng ý với những gì Kendall đã thêm, nó rất hữu ích, nhưng tôi khuyên bạn vẫn nên thực hiện biến môi trường để bạn không quên chúng đã được kích hoạt. Tương tự như liên kết (hiện đã hết hạn) tại Cocoa Dev, tôi đặt cái này để không bỏ lỡ:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

Nó thu hút sự chú ý của tôi rất độc đáo.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.