ฉันเคยเห็นคำแนะนำว่าให้ตั้งค่าNSZombieEnabled
เป็นtrue
ในขณะที่แก้ไขข้อบกพร่อง NSZombie คืออะไร? เป็นกรอบหรือไม่? การตั้งค่า?
ฉันเคยเห็นคำแนะนำว่าให้ตั้งค่าNSZombieEnabled
เป็นtrue
ในขณะที่แก้ไขข้อบกพร่อง NSZombie คืออะไร? เป็นกรอบหรือไม่? การตั้งค่า?
คำตอบ:
เป็นตัวช่วยในการแก้จุดบกพร่องของหน่วยความจำ โดยเฉพาะอย่างยิ่งเมื่อคุณตั้งค่าNSZombieEnabled
เมื่อใดก็ตามที่วัตถุถึงจำนวนนับ 0 แทนที่จะถูกจัดสรรมันจะแปรเปลี่ยนเป็นNSZombie
อินสแตนซ์ เมื่อใดก็ตามที่ซอมบี้ตัวนี้ได้รับข้อความมันจะบันทึกคำเตือนแทนที่จะหยุดทำงานหรือทำงานในลักษณะที่คาดเดาไม่ได้ ด้วยเหตุนี้คุณจึงสามารถแก้ไขปัญหาการโอเวอร์รีลีส / การปลดอัตโนมัติที่ละเอียดอ่อนโดยไม่ต้องใช้เครื่องมือขั้นสูงหรือเข็มที่ต้องใช้ความพยายามในการค้นหากองหญ้า
ชื่อนี้เป็นการเล่นที่ค่อนข้างชัดเจนเกี่ยวกับความจริงที่ว่าโดยปกติแล้ววัตถุจะถูกมองว่า "ตาย" เมื่อพวกมันถึงยังคงนับ 0 ด้วยการตั้งค่านี้พวกมันยังคงมีอยู่ในครึ่งชีวิตที่แปลกประหลาดไม่ว่าจะมีชีวิตอยู่หรือไม่ก็ตายไปแล้ว เหมือนซอมบี้จริงๆยกเว้นว่ากินสมองน้อยกว่า
อดัมทำงานได้ดีมากในการอธิบายว่าซอมบี้คืออะไร แต่การใช้ตัวแปรสภาพแวดล้อมไม่ใช่วิธีที่ดีที่สุดในการค้นหาและติดตามสิ่งเหล่านี้
แนวทางที่ดีกว่ามากในการตรวจจับซอมบี้คือการใช้เครื่องมือ - จาก XCode เริ่มต้นด้วย "Run with Instrument" และเลือก "Allocations"
จากนั้นหยุดการบันทึกทันทีหลังจากเริ่มต้นกดปุ่ม "i" บนเครื่องมือการจัดสรรและเปิด "เปิดใช้งานการนับการอ้างอิง" และ "เปิดใช้งานการตรวจหา NSZombie" ตอนนี้กดบันทึกอีกครั้งในเครื่องมือและแอปของคุณจะเริ่มทำงาน - หากมีการส่งวัตถุซอมบี้ใด ๆ การบันทึกข้อความจะหยุดลงและกล่องโต้ตอบจะปรากฏขึ้นในไทม์ไลน์การบันทึก - คุณสามารถคลิกเพื่อค้นหาทุกที่ที่วัตถุ เก็บไว้หรือปล่อย
แก้ไข: คำแนะนำก่อนหน้านี้สำหรับ XCode 3 นี่คือส่วนเพิ่มเติมสำหรับ XCode 4:
ใน XCode 4.2มีกลไกที่ง่ายกว่าในการใช้การตรวจจับซอมบี้นั่นคือ Zombie Instrument แทนที่จะ "เรียกใช้" เพื่อเริ่มแอปให้ใช้ "โปรไฟล์" และตัวเลือกเครื่องมือจะปรากฏขึ้น เลือก "Zombie" และแอปจะเริ่มทำงาน - ทำทุกอย่างที่ทำให้คุณขัดข้องกล่องโต้ตอบจะปรากฏขึ้นว่า "Zombie Messaged"
จากนั้นคลิกลูกศรเล็ก ๆ ในกล่องโต้ตอบ ซึ่งจะนำไปสู่รายการเวลาทั้งหมดที่วัตถุซอมบี้ถูกสร้างเก็บรักษาหรือปล่อยออกมา ดึงแถบด้านข้างขึ้นและคุณสามารถไปที่แต่ละรายการโดยดูที่การติดตามสแต็กสำหรับโค้ดที่รับผิดชอบการปรับแต่ละครั้งในจำนวนการเก็บรักษา
ฉันเห็นด้วยกับสิ่งที่ Kendall เพิ่มมันมีประโยชน์มาก แต่ฉันขอแนะนำให้ใช้ตัวแปรสภาพแวดล้อมเพื่อที่คุณจะได้ไม่ลืมว่ามันเปิดใช้งานอยู่ คล้ายกับลิงก์ (หมดอายุแล้ว) ที่ Cocoa Dev ฉันใส่ไว้ดังนั้นฉันจึงไม่พลาด:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
มันดึงดูดความสนใจของฉันเป็นอย่างมาก
จะช่วยใครบางคน
เอกสารรายละเอียดเกี่ยวกับตราสาร https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1