ฉันจะตั้งค่า NSZombieEnabled ใน Xcode 4 ได้อย่างไร


456

ฉันจะตั้งค่าNSZombieEnabledและCFZombieLevelสำหรับปฏิบัติการของฉันใน Xcode 4 ได้อย่างไร


1
คุณถามเกี่ยวกับ Xcode 4 หรือไม่?
Jehiah

8
ทำไมตัวเลือกเช่นนี้ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นเป็นสิ่งที่เกินกว่าฉัน ...
Daniel Magnusson

26
เพราะโดยทั่วไปจะป้องกันการเพิ่มหน่วยความจำที่แท้จริงซึ่งไม่ได้เป็นความคิดที่ดีที่จะเปิดใช้งานตามค่าเริ่มต้น
Chetan

14
@Daniel Magnusson: มันเป็นสิ่งที่เอาชีวิตรอด ด้วยการพัฒนาด้วย XCode ที่ไม่เป็นมิตร แต่ใช้งานได้คุณจะได้รับ devs ที่ดีขึ้น ผมล้อเล่น.
Dan Rosenstark

3
@DanielMagnusson ฉันคิดว่านี่ไม่ใช่ความคิดที่ดี AFAIK โหมด "Zombie" จะเปลี่ยนวัตถุทุกชนิดเป็นวัตถุ ob ชนิดพิเศษเพื่อให้สามารถตรวจจับได้เมื่อได้รับข้อความ ดังนั้นการเปิดใช้งาน "โหมดซอมบี้" จะทำให้ไม่มีการยกเลิกการจัดสรรวัตถุดังนั้นคุณควรใช้เมื่อแก้ไขข้อผิดพลาดดังกล่าวเท่านั้น
เบซิ

คำตอบ:


753

ใน Xcode 4.x กด

R

(หรือคลิกMenubar> Product> Scheme> Edit Scheme)

เลือกแท็บ "การวินิจฉัย" และคลิก "เปิดใช้งานออบเจ็กต์ซอมบี้":

คลิก "เปิดใช้งานออบเจ็กต์ซอมบี้"

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

กรณีทั่วไปคือเมื่อคุณปล่อยวัตถุมากเกินไปและคุณไม่รู้ว่าตัวใด:

  • ด้วยซอมบี้: -[UITableView release]: message sent to deallocated instance
  • ไม่มีซอมบี้: EXC_BAD_ACCESS

การตั้งค่า Xcode นี้จะถูกละเว้นเมื่อคุณเก็บถาวรแอปพลิเคชันสำหรับการส่ง App Store คุณไม่จำเป็นต้องแตะอะไรก่อนปล่อยแอปพลิเคชันของคุณ

การกดRเหมือนกับการเลือกผลิตภัณฑ์> เรียกใช้ขณะที่Altกดปุ่มค้าง
การคลิกช่องทำเครื่องหมาย "เปิดใช้งานออบเจ็กต์ซอมบี้" จะเหมือนกับการเพิ่ม "NSZombieEnabled = YES" ด้วยตนเองในส่วน "ตัวแปรสภาพแวดล้อม" ของแท็บอาร์กิวเมนต์


27
ขอบคุณ - ฉันสงสัยว่าพวกเขาซ่อนตัวเลือกเหล่านี้ไว้ที่ไหนฉันรู้ว่านี่เป็นหน้าต่างเดียวกับในเมนู 'แก้ไขแบบแผน'
emp

1
เพียงเพิ่มในสิ่งนี้การทำในหน้าจอ "Run" เป็นการตั้งค่าสำหรับ "ทดสอบ" เช่นกันหากมีการทำเครื่องหมายในช่อง "ใช้ตัวเลือก Run action" หากคุณต้องการทำเพียงแค่การทดสอบกล่องนั้นจะต้องไม่ถูกตรวจสอบ
Cameron

1
โปรดทราบว่าตัวเลือกนี้จะปรากฏใน Xcode 4.1 (ใช่ไหม)
phi

2
ใน XCode 5 (และรุ่นที่ใหม่กว่า 4 - 4.3.x แน่นอนว่าก่อนหน้านี้) นี่คือCMD-<( CMD-SHIFT-comma) หรือProduct -> Scheme -> Edit SCheme...
Olie

1
ฉันติดอยู่ในปัญหาแปลก ๆ ของ EXC_BAD_ACCESS แม้แต่ซอมบี้ก็ถูกข้ามไปมันคงจะดีถ้าคุณสามารถชี้นำฉันสำหรับstackoverflow.com/questions/29210057/
Anoop Vaidya

70

คำตอบของ Jano คือวิธีที่ง่ายที่สุดในการค้นหา .. อีกวิธีหนึ่งคือหากคุณคลิกที่แถบเลื่อนลงของโครงการ -> แก้ไขรูปแบบ -> แท็บอาร์กิวเมนต์แล้วเพิ่ม NSZombieEnabled ในคอลัมน์ตัวแปรสภาพแวดล้อมและใช่ในคอลัมน์ค่า ...


57

ฉันพบว่าตัวเลือกนี้สะดวกกว่า:

  1. คลิกที่ "เรียกใช้ปุ่มแบบเลื่อนลง"
  2. จากรายการให้เลือก Profile
  3. โปรแกรม "เครื่องมือ" ควรเปิดที่ซึ่งคุณสามารถเลือกได้ Zombies
  4. ตอนนี้คุณสามารถโต้ตอบกับแอพและพยายามทำให้เกิดข้อผิดพลาด
  5. ทันทีที่เกิดข้อผิดพลาดคุณควรได้รับคำใบ้เมื่อวัตถุของคุณถูกปล่อยออกมาและถูกยกเลิกการจัดสรร

ซอมบี้

ทันทีที่ตรวจพบซอมบี้คุณจะได้รับ "Zombie Stack" ที่เรียบร้อยซึ่งจะแสดงให้คุณเห็นเมื่อมีการจัดสรรวัตถุที่เป็นปัญหาและที่ที่มันถูกเก็บหรือปล่อยออกมา:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

ข้อดีเมื่อเปรียบเทียบกับการใช้แท็บการวินิจฉัยของ Xcode Schemes :

  1. หากคุณลืมที่จะยกเลิกการเลือกตัวเลือกในแท็บการวินิจฉัยจะไม่มีการปล่อยวัตถุใด ๆ จากหน่วยความจำ

  2. คุณได้รับสแต็กที่มีรายละเอียดมากขึ้นซึ่งแสดงให้คุณเห็นว่าวัตถุที่เสียหายของคุณได้รับการจัดสรร / เผยแพร่หรือเก็บไว้


1
ตัวเลือก "Zombies" หายไปใน XCode 4 ของฉันทำไม
Li Fumin

4
ให้แน่ใจว่าคุณกำลังเลือกiOS Simulator > Allจากรายการแม่แบบหลัก (คุณสามารถทำเช่นนี้ในการจำลอง)
Besi

ด้วยเหตุผลบางอย่าง .. ถ้าฉันเลือก 'zombies' มันแค่แสดงการจัดสรร .. ความคิดใด ๆ ว่าทำไม?
abbood

นี่คือทางออกที่ดีที่สุด ช่วยฉันได้มาก :)
Michał Miszczyszyn

5

ใน Xcode 4.2

  • ชื่อโครงการ / แก้ไขโครงการ / การวินิจฉัย /
  • เปิดใช้งานกล่องกาเครื่องหมาย Zombie Objects
  • คุณทำเสร็จแล้ว


1

Cocoa นำเสนอฟีเจอร์สุดเจ๋งที่ช่วยเพิ่มความสามารถของคุณในการดีบักสถานการณ์ดังกล่าว มันเป็นตัวแปรสภาพแวดล้อมที่เรียกว่า NSZombieEnabled ดูวิดีโอนี้ ที่อธิบายการตั้งค่า NSZombieEnabled ใน object-C


-1

ใน Xcode> 4.3:

คุณคลิกที่แถบดร็อปดาวน์สกีม -> edit scheme -> แท็บอาร์กิวเมนต์จากนั้นเพิ่ม NSZombieEnabled ในคอลัมน์ Environment Variables และ YES ในคอลัมน์ค่า

โชคดี !!!

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