NSZombie คืออะไร?


97

ฉันเคยเห็นคำแนะนำว่าให้ตั้งค่าNSZombieEnabledเป็นtrueในขณะที่แก้ไขข้อบกพร่อง NSZombie คืออะไร? เป็นกรอบหรือไม่? การตั้งค่า?


18
NSObject ที่ไม่ตาย - ระวัง!
vikingosegundo

5
วัตถุที่ไม่ตาย *
Alex Zavatone

คำตอบ:


195

เป็นตัวช่วยในการแก้จุดบกพร่องของหน่วยความจำ โดยเฉพาะอย่างยิ่งเมื่อคุณตั้งค่าNSZombieEnabledเมื่อใดก็ตามที่วัตถุถึงจำนวนนับ 0 แทนที่จะถูกจัดสรรมันจะแปรเปลี่ยนเป็นNSZombieอินสแตนซ์ เมื่อใดก็ตามที่ซอมบี้ตัวนี้ได้รับข้อความมันจะบันทึกคำเตือนแทนที่จะหยุดทำงานหรือทำงานในลักษณะที่คาดเดาไม่ได้ ด้วยเหตุนี้คุณจึงสามารถแก้ไขปัญหาการโอเวอร์รีลีส / การปลดอัตโนมัติที่ละเอียดอ่อนโดยไม่ต้องใช้เครื่องมือขั้นสูงหรือเข็มที่ต้องใช้ความพยายามในการค้นหากองหญ้า

ชื่อนี้เป็นการเล่นที่ค่อนข้างชัดเจนเกี่ยวกับความจริงที่ว่าโดยปกติแล้ววัตถุจะถูกมองว่า "ตาย" เมื่อพวกมันถึงยังคงนับ 0 ด้วยการตั้งค่านี้พวกมันยังคงมีอยู่ในครึ่งชีวิตที่แปลกประหลาดไม่ว่าจะมีชีวิตอยู่หรือไม่ก็ตายไปแล้ว เหมือนซอมบี้จริงๆยกเว้นว่ากินสมองน้อยกว่า


61
ระมัดระวังในการลบการตั้งค่านี้เมื่อคุณทำการดีบักเสร็จแล้วเพราะมันจะรั่วทุกออบเจ็กต์
จัสติน

1
ขอบคุณสำหรับคำอธิบายง่ายๆนี้ แจ้งให้ทราบว่า Cocoa Dev Link ไม่ทำงานอีกต่อไป +1 สำหรับระยะสั้นและตรงประเด็น
CRDave

95

อดัมทำงานได้ดีมากในการอธิบายว่าซอมบี้คืออะไร แต่การใช้ตัวแปรสภาพแวดล้อมไม่ใช่วิธีที่ดีที่สุดในการค้นหาและติดตามสิ่งเหล่านี้

แนวทางที่ดีกว่ามากในการตรวจจับซอมบี้คือการใช้เครื่องมือ - จาก XCode เริ่มต้นด้วย "Run with Instrument" และเลือก "Allocations"

จากนั้นหยุดการบันทึกทันทีหลังจากเริ่มต้นกดปุ่ม "i" บนเครื่องมือการจัดสรรและเปิด "เปิดใช้งานการนับการอ้างอิง" และ "เปิดใช้งานการตรวจหา NSZombie" ตอนนี้กดบันทึกอีกครั้งในเครื่องมือและแอปของคุณจะเริ่มทำงาน - หากมีการส่งวัตถุซอมบี้ใด ๆ การบันทึกข้อความจะหยุดลงและกล่องโต้ตอบจะปรากฏขึ้นในไทม์ไลน์การบันทึก - คุณสามารถคลิกเพื่อค้นหาทุกที่ที่วัตถุ เก็บไว้หรือปล่อย

แก้ไข: คำแนะนำก่อนหน้านี้สำหรับ XCode 3 นี่คือส่วนเพิ่มเติมสำหรับ XCode 4:

ใน XCode 4.2มีกลไกที่ง่ายกว่าในการใช้การตรวจจับซอมบี้นั่นคือ Zombie Instrument แทนที่จะ "เรียกใช้" เพื่อเริ่มแอปให้ใช้ "โปรไฟล์" และตัวเลือกเครื่องมือจะปรากฏขึ้น เลือก "Zombie" และแอปจะเริ่มทำงาน - ทำทุกอย่างที่ทำให้คุณขัดข้องกล่องโต้ตอบจะปรากฏขึ้นว่า "Zombie Messaged"

จากนั้นคลิกลูกศรเล็ก ๆ ในกล่องโต้ตอบ ซึ่งจะนำไปสู่รายการเวลาทั้งหมดที่วัตถุซอมบี้ถูกสร้างเก็บรักษาหรือปล่อยออกมา ดึงแถบด้านข้างขึ้นและคุณสามารถไปที่แต่ละรายการโดยดูที่การติดตามสแต็กสำหรับโค้ดที่รับผิดชอบการปรับแต่ละครั้งในจำนวนการเก็บรักษา


2
นี่เป็นคำแนะนำที่มีประโยชน์อย่างเหลือเชื่อ
w.donahue

4
ฉันอัปเดตคำตอบสำหรับ XCode 4 เนื่องจากทำให้การตรวจจับซอมบี้ในเครื่องมือง่ายยิ่งขึ้น
Kendall Helmstetter Gelner

ไม่น่าจะทำงานได้เหมือนกันกับ XCode 5 และ 6
Kendall Helmstetter Gelner

2
ฉันยังสามารถยืนยันได้ด้วยXCode 7.2
บีท

31

ฉันเห็นด้วยกับสิ่งที่ Kendall เพิ่มมันมีประโยชน์มาก แต่ฉันขอแนะนำให้ใช้ตัวแปรสภาพแวดล้อมเพื่อที่คุณจะได้ไม่ลืมว่ามันเปิดใช้งานอยู่ คล้ายกับลิงก์ (หมดอายุแล้ว) ที่ Cocoa Dev ฉันใส่ไว้ดังนั้นฉันจึงไม่พลาด:

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

มันดึงดูดความสนใจของฉันเป็นอย่างมาก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.