ได้รับสัญญาณ EXC_BAD_ACCESS


290

เมื่อปรับใช้แอปพลิเคชันไปยังอุปกรณ์โปรแกรมจะออกหลังจากไม่กี่รอบด้วยข้อผิดพลาดต่อไปนี้:

Program received signal: "EXC_BAD_ACCESS".

โปรแกรมทำงานได้โดยไม่มีปัญหาใด ๆ บน iPhone simulator มันจะทำการดีบั๊กและรันตราบใดที่ฉันทำตามคำแนะนำทีละรายการ ทันทีที่ฉันปล่อยให้มันทำงานอีกครั้งฉันจะชนEXC_BAD_ACCESSสัญญาณ

ในกรณีนี้มันเป็นข้อผิดพลาดในรหัส accelerometer มันจะไม่ดำเนินการภายในเครื่องจำลองซึ่งเป็นสาเหตุที่ทำให้ไม่เกิดข้อผิดพลาดใด ๆ อย่างไรก็ตามมันจะดำเนินการปรับใช้ครั้งเดียวกับอุปกรณ์

คำตอบสำหรับคำถามนี้ส่วนใหญ่จะจัดการกับEXC_BAD_ACCESSข้อผิดพลาดทั่วไปดังนั้นฉันจะปล่อยให้สิ่งนี้เปิดเป็น catch-all สำหรับข้อผิดพลาด Bad Access ที่น่ากลัว

EXC_BAD_ACCESSโดยทั่วไปจะถูกโยนลงเนื่องจากการเข้าถึงหน่วยความจำที่ผิดกฎหมาย คุณสามารถค้นหาข้อมูลเพิ่มเติมได้จากคำตอบด้านล่าง

คุณเคยพบEXC_BAD_ACCESSสัญญาณมาแล้วและคุณรับมือกับมันอย่างไร

คำตอบ:


196

จากคำอธิบายของคุณฉันสงสัยว่าคำอธิบายที่เป็นไปได้มากที่สุดคือคุณมีข้อผิดพลาดในการจัดการหน่วยความจำของคุณ คุณบอกว่าคุณทำงานเกี่ยวกับการพัฒนา iPhone มาหลายสัปดาห์ แต่ไม่ว่าคุณจะเคยมีประสบการณ์กับ Objective C หรือไม่ หากคุณมาจากพื้นหลังอื่นอาจใช้เวลาสักครู่ก่อนที่คุณจะปรับกฎการจัดการหน่วยความจำให้เป็นจริง

จำไว้ว่าสิ่งใดก็ตามที่คุณได้รับจากฟังก์ชั่นการจัดสรร (โดยปกติคือวิธีการจัดสรรแบบสแตติก แต่มีบางวิธี) หรือวิธีการคัดลอกคุณเป็นเจ้าของหน่วยความจำด้วยและต้องปล่อยเมื่อคุณทำเสร็จ

แต่ถ้าคุณได้อะไรกลับมาจากสิ่งอื่นรวมถึงวิธีการของโรงงาน (เช่น[NSString stringWithFormat] ) คุณจะต้องมีการอ้างอิงอัตโนมัติซึ่งหมายความว่ามันอาจจะถูกปล่อยออกมาในอนาคตด้วยรหัสอื่นในอนาคต - ดังนั้นจึงเป็นสิ่งสำคัญที่คุณต้องการ เพื่อให้มันอยู่นอกเหนือฟังก์ชั่นที่คุณเก็บไว้ หากคุณไม่ทำเช่นนั้นหน่วยความจำอาจยังคงถูกจัดสรรในขณะที่คุณกำลังใช้งานหรือถูกปล่อย แต่ยังคงใช้ได้โดยบังเอิญในระหว่างการทดสอบตัวจำลอง แต่มีแนวโน้มที่จะถูกนำออกใช้และแสดงเป็นข้อผิดพลาดการเข้าถึงที่ไม่ดีเมื่อทำงานบนอุปกรณ์

วิธีที่ดีที่สุดในการติดตามสิ่งเหล่านี้และความคิดที่ดีอยู่แล้ว (แม้ว่าจะไม่มีปัญหาชัดเจน) คือการเรียกใช้แอพในเครื่องมือเครื่องมือโดยเฉพาะอย่างยิ่งกับตัวเลือกการรั่วไหล


2
ฉันมีรหัสการสุ่มตัวอย่าง accelerometer ที่ไม่สำคัญสำหรับแอปของฉันซึ่งหลังจากลบออกกำจัดข้อผิดพลาดการเข้าถึงที่ไม่ดี ซึ่งสมเหตุสมผลแล้วเมื่อพิจารณาว่าตัวจำลองไม่มี accelerometer ฉันจะพบว่ามันแปลกว่ารหัสนี้มีอยู่แตะต้องเป็นเวลาหนึ่งสัปดาห์ก่อนที่จะก่อให้เกิดข้อผิดพลาดนี้ ...
Héctorรามอส

ฉันใหม่กับ Objective-C ดังนั้นปัญหาส่วนใหญ่ของฉันควรเกิดขึ้นจากการจัดการหน่วยความจำ หลังจากไม่กี่ปีใน C ++ ฉันใช้ Java เป็นส่วนใหญ่ในช่วงสามหรือสี่ปีที่ผ่านมาดังนั้นฉันจึงหมดแรงในการจัดการหน่วยความจำ ขอบคุณสำหรับคำตอบ!
Héctor Ramos

4
ไม่มีปัญหา - ดีใจที่คุณแก้ไข การจัดการหน่วยความจำนั้นไม่ใช่เรื่องยากที่จะทำคุณต้องทำให้แน่ใจว่าคุณได้เรียนรู้กฎและนิสัยที่ดี
philsquared

ดูเหมือนว่าฉันจะมีปัญหาเฉพาะกับการก้าวร้าวมากเกินไปในการปล่อยสตริง (และเช่นนั้น) ที่ฉันสร้าง ฉันยังไม่แน่ใจ 100% เกี่ยวกับสิ่งที่ควรได้รับการปล่อยตัวและเมื่อใด แต่คำตอบของฟิลช่วยได้แน่นอน
266 pluckyglen

ถ้าฉันทำตามนั้นอย่างถูกต้อง cmculloh ใช่นั่นเป็นสิ่งที่ถูกต้อง คุณไม่ได้เป็นเจ้าของการส่งคืนวัตถุจาก objectAtIndex
philsquared

101

สาเหตุหลักของ EXC_BAD_ACCESS นั้นมาจากการพยายามเข้าถึงวัตถุที่ถูกปล่อยออกมา

หากต้องการค้นหาวิธีแก้ไขปัญหานี้โปรดอ่านเอกสารนี้: DebuggingAutoReleasePool

แม้ว่าคุณจะไม่คิดว่าคุณเป็น "ปล่อยวัตถุที่ออกโดยอัตโนมัติ" สิ่งนี้จะมีผลกับคุณ

วิธีนี้ใช้ได้ดีมาก ฉันใช้มันตลอดเวลาด้วยความสำเร็จที่ยิ่งใหญ่ !!

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

sidenote:

การรันเครื่องมือและการตรวจหารอยรั่วจะไม่ช่วยแก้ไขปัญหา EXC_BAD_ACCESS ฉันค่อนข้างมั่นใจว่าหน่วยความจำรั่วไม่มีส่วนเกี่ยวข้องกับ EXC_BAD_ACCESS คำจำกัดความของการรั่วไหลเป็นวัตถุที่คุณไม่สามารถเข้าถึงได้อีกต่อไปดังนั้นคุณจึงไม่สามารถเรียกมันได้

อัปเดต: ตอนนี้ฉันใช้เครื่องมือเพื่อดีบักการรั่วไหล จาก Xcode 4.2 เลือก Product-> Profile และเมื่อเครื่องมือเปิดตัวเลือก "Zombies"


18
sidenote นั้นสำคัญมาก การรั่วไหลไม่สามารถทำให้เกิด EXC_BAD_ACCESS (มีปัญหาอื่น ๆ ) ฉันเขียนสิ่งนี้เพื่อพยายามล้างความเข้าใจที่คลาดเคลื่อนเกี่ยวกับ EXC_BAD_ACCESS loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html
Lou Franco

4
เครื่องมือซอมบี้ใน Xcode นั้นยอดเยี่ยม! ฉันพบผู้กระทำผิดภายใน 3 นาทีไม่ใช่ชั่วโมง
Aram Kocharyan

1
ลิงก์ด้านบนในคำตอบไม่พร้อมใช้งาน แสดงข้อผิดพลาด 404 ที่ไม่พบ
Tejas

12

สัญญาณ EXC_BAD_ACCESS เป็นผลลัพธ์ของการส่งตัวชี้ที่ไม่ถูกต้องไปยังการเรียกของระบบ ฉันเพิ่งได้รับเมื่อเร็ว ๆ นี้ด้วยโปรแกรมทดสอบบน OS X - ฉันผ่านตัวแปรที่ไม่มีการกำหนดค่าเริ่มต้นไปให้pthread_join()ซึ่งเป็นเพราะพิมพ์ผิดก่อนหน้านี้

ฉันไม่คุ้นเคยกับการพัฒนา iPhone แต่คุณควรตรวจสอบพอยน์เตอร์พอยน์เตอร์ทั้งหมดของคุณว่าคุณกำลังผ่านการเรียกระบบ เหวี่ยงระดับคำเตือนของคอมไพเลอร์ของคุณไปตลอดทาง (ด้วย gcc ใช้-Wallและ-Wextraตัวเลือก) เปิดใช้งานการวินิจฉัยจำนวนมากบนตัวจำลอง / ดีบักเกอร์เท่าที่จะทำได้


8

จากประสบการณ์ของฉันสิ่งนี้มักเกิดจากการเข้าถึงหน่วยความจำที่ผิดกฎหมาย ตรวจสอบพอยน์เตอร์ทั้งหมดโดยเฉพาะอย่างยิ่งพอยน์เตอร์พอยน์เตอร์เพื่อให้แน่ใจว่าเริ่มต้นได้แล้ว ตรวจสอบให้แน่ใจว่าไฟล์ MainWindow.xib ของคุณตั้งค่าไว้อย่างถูกต้องด้วยการเชื่อมต่อที่จำเป็นทั้งหมด

หากไม่มีการตรวจสอบบนกระดาษที่จะเกิดอะไรขึ้นและมันจะไม่เกิดขึ้นเมื่อก้าวเดียวลองค้นหาข้อผิดพลาดด้วยคำสั่ง NSLog (): โรยรหัสของคุณกับพวกเขาย้ายพวกเขาไปรอบ ๆ จนกว่าคุณจะแยกบรรทัดที่ก่อให้เกิด ข้อผิดพลาด. จากนั้นตั้งค่าเบรกพอยต์บนบรรทัดนั้นและเรียกใช้โปรแกรมของคุณ เมื่อคุณกดเบรกพอยต์ตรวจสอบตัวแปรทั้งหมดและวัตถุในนั้นเพื่อดูว่ามีอะไรที่ไม่เหมือนที่คุณคาดหวังหรือไม่โดยเฉพาะอย่างยิ่งฉันต้องจับตาดูตัวแปรที่ชั้นวัตถุเป็นสิ่งที่คุณไม่คาดคิด หากตัวแปรควรมี UIWindow แต่มี NSNotification อยู่ในนั้นแทนข้อผิดพลาดของรหัสพื้นฐานเดียวกันอาจปรากฏขึ้นในวิธีที่แตกต่างเมื่อดีบักเกอร์ไม่ทำงาน


7

ฉันใช้เวลาสองชั่วโมงในการติดตาม EXC_BAD_ACCESS และพบ NSZombies และ env vars อื่น ๆ ดูเหมือนจะไม่บอกอะไรเลย

สำหรับฉันมันเป็นคำสั่ง NSLog ที่โง่ที่มีตัวระบุรูปแบบ แต่ไม่ผ่าน args

NSLog(@"Some silly log message %@-%@");

แก้ไขโดย

NSLog(@"Some silly log message %@-%@", someObj1, someObj2);

6

วิดีโอ WWDC 2010 มีให้สำหรับผู้เข้าร่วมทุกคนในโปรแกรมผู้พัฒนาแอปเปิ้ล มีวิดีโอที่ยอดเยี่ยม: "เซสชั่น 311 - การวิเคราะห์หน่วยความจำขั้นสูงด้วยเครื่องมือ" ที่แสดงตัวอย่างของการใช้ซอมบี้ในเครื่องมือและการแก้ไขปัญหาหน่วยความจำอื่น ๆ

สำหรับการเชื่อมโยงไปยังหน้าเข้าสู่ระบบคลิกที่นี่


6

ไม่ใช่คำตอบที่สมบูรณ์ แต่มีสถานการณ์เฉพาะอย่างหนึ่งที่ฉันได้รับคือเมื่อพยายามเข้าถึงวัตถุที่ 'ตาย' เพราะฉันพยายามใช้การยกเลิกอัตโนมัติ:

netObjectDefinedInMyHeader = [[[MyNetObject alloc] init] autorelease];

ตัวอย่างเช่นฉันจริง ๆ แล้วผ่านสิ่งนี้เป็นวัตถุเพื่อ 'แจ้งเตือน' (ลงทะเบียนเป็นผู้ฟังผู้สังเกตการณ์ไม่ว่าคุณจะชอบสำนวนใด) แต่มันก็ตายไปแล้วเมื่อมีการส่งการแจ้งเตือนและฉันจะได้รับ EXC_BAD_ACCESS เปลี่ยนเป็น[[MyNetObject alloc] init]และปล่อยในภายหลังตามความเหมาะสมแก้ไขข้อผิดพลาด

เหตุผลอื่นที่อาจเกิดขึ้นนี้เป็นตัวอย่างถ้าคุณผ่านวัตถุและพยายามเก็บมัน:

myObjectDefinedInHeader = aParameterObjectPassedIn;

ในภายหลังเมื่อพยายามเข้าถึง myObjectDefinedInHeader คุณอาจประสบปัญหา โดยใช้:

myObjectDefinedInHeader = [aParameterObjectPassedIn retain];

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


5

เพียงเพิ่มสถานการณ์อื่นที่อาจเกิดขึ้น:

ฉันมีรหัส:

NSMutableString *string;
[string   appendWithFormat:@"foo"];

เห็นได้ชัดว่าฉันลืมจัดสรรหน่วยความจำสำหรับสตริง:

NSMutableString *string = [[NSMutableString alloc] init];
[string   appendWithFormat:@"foo"];

แก้ไขปัญหา


นี่ไม่ได้ทำให้เกิดข้อผิดพลาดใด ๆ สำหรับฉันเพราะสตริงได้รับการเตรียมใช้งานเป็นศูนย์และการใช้รูปแบบวัตถุ null เรียกวิธีการในศูนย์จะไม่ทำอะไรเลย
Liron Yahdav

5

อีกวิธีหนึ่งสำหรับการตรวจจับข้อยกเว้น EXC_BAD_ACCESS ก่อนที่จะเกิดขึ้นคือตัววิเคราะห์แบบคงที่ใน XCode 4+

รันตัววิเคราะห์แบบสแตติกด้วยผลิตภัณฑ์> วิเคราะห์ (shift + cmd + B) การคลิกที่ข้อความใด ๆ ที่สร้างขึ้นโดยตัววิเคราะห์จะซ้อนทับไดอะแกรมบนแหล่งที่มาของคุณซึ่งแสดงลำดับของการเก็บรักษา / การเปิดตัวของวัตถุที่ละเมิด

ป้อนคำอธิบายรูปภาพที่นี่


5

ฉันพบว่ามีประโยชน์ในการตั้งค่าเบรกพอยต์บน objc_exception_throw วิธีการที่ดีบักเกอร์ควรแตกเมื่อคุณได้รับ EXC_BAD_ACCESS

คำแนะนำสามารถพบได้ที่นี่DebuggingTechniques


4

ใช้กฎง่าย ๆ ของ "ถ้าคุณไม่จัดสรรหรือเก็บไว้อย่าปล่อย"


1
ขยายกฎนั้นด้วย "... คัดลอกกฎ ... " และคุณน่าจะใช้ได้
จนถึง

4

วิธีแก้ไขข้อบกพร่อง EXC_BAD_ACCESS

ลองดูลิงค์ด้านบนและทำตามที่ระบุไว้ .... เพียงแค่คำแนะนำสั้น ๆ สำหรับการใช้ NSZombies

เรียกใช้แอปพลิเคชันและหลังจากล้มเหลว (ควรแสดง "ขัดจังหวะ" มากกว่า "EXC_BAD_ACCESS" ... ตรวจสอบคอนโซล (เรียกใช้> คอนโซล) ... ควรมีข้อความปรากฏขึ้นเพื่อบอกว่าวัตถุใดที่พยายามจะเข้าถึง

-Ben


3

ฉันได้ทำการดีบั๊กและสร้างรหัสใหม่เพื่อแก้ไขข้อผิดพลาดนี้ในช่วงสี่ชั่วโมงที่ผ่านมา โพสต์ด้านบนทำให้ฉันเห็นปัญหา:

คุณสมบัติก่อนหน้า: startPoint = [[DataPoint alloc] init]; startPoint = [DataPointList objectAtIndex: 0];
. . . x = startPoint.x - 10; // EXC_BAD_ACCESS

คุณสมบัติหลังจาก: startPoint = [[DataPoint alloc] init]; startPoint = [[DataPointList objectAtIndex: 0] เก็บไว้];

ลาก่อน EXC_BAD_ACCESS


ฉันทำผิดพลาดคล้ายกัน ฉันลืมที่จะกู้คืนอินสแตนซ์ที่ทำให้เกิดความผิดพลาดและฉันใช้เวลาหลายชั่วโมงในการคิดออก ประสบการณ์ของคุณทำให้ฉันพบว่าเป็นของฉัน ขอบคุณ!
David.Chu.ca

3

หวังว่าคุณจะปล่อย 'สตริง' เมื่อคุณทำเสร็จแล้ว!


3

ฉันลืมส่งคืนตนเองใน init-Method ... ;)


นี่ควรเป็นคำเตือน / ข้อผิดพลาดเวลาคอมไพล์และไม่ใช่ EXC_BAD_ACCESS ระหว่างการรันไทม์
stigi

3

นี่เป็นกระทู้ที่ยอดเยี่ยม นี่คือประสบการณ์ของฉัน: ฉันทำผิดพลาดกับคำหลักรักษา / กำหนดในการประกาศทรัพย์สิน ฉันพูดว่า:

@property (nonatomic, assign) IBOutlet UISegmentedControl *choicesControl;
@property (nonatomic, assign) IBOutlet UISwitch *africaSwitch;
@property (nonatomic, assign) IBOutlet UISwitch *asiaSwitch;

ที่ฉันควรจะพูด

@property (nonatomic, retain) IBOutlet UISegmentedControl *choicesControl;
@property (nonatomic, retain) IBOutlet UISwitch *africaSwitch;
@property (nonatomic, retain) IBOutlet UISwitch *asiaSwitch;

1
แปลกทำไมคุณต้องเก็บ IBOutlet การจัดการของพวกเขาจะทำเพื่อคุณโดยอัตโนมัติ
jv42

3

ฉันพบ EXC_BAD_ACCESS บน iPhone เท่านั้นในขณะที่พยายามเรียกใช้เมธอด C ที่มีอาร์เรย์ขนาดใหญ่ ตัวจำลองสามารถให้หน่วยความจำเพียงพอแก่ฉันในการรันโค้ด แต่ไม่ใช่อุปกรณ์ (อาเรย์เป็นตัวอักษรนับล้านตัวดังนั้นมันจึงมากเกินไปหน่อย!)

EXC_BAD_ACCESS เกิดขึ้นหลังจากจุดเริ่มต้นของวิธีการและทำให้ฉันสับสนไปสักพักเพราะมันอยู่ใกล้กับการประกาศอาร์เรย์

บางทีคนอื่นอาจได้รับประโยชน์จากการดึงผมสองสามชั่วโมง


3

ลืมที่จะออกจากตัวชี้ไม่ใช่ alloc'd deallocจาก ฉันได้รับ exc_bad_access จาก rootView ของ UINavigationController แต่บางครั้งเท่านั้น ฉันสันนิษฐานว่าปัญหาอยู่ใน rootView เพราะมันหยุดทำงานครึ่งหนึ่งผ่าน viewDidAppear {} มันกลับกลายเป็นว่าเกิดขึ้นหลังจากที่ฉันเปิดมุมมองด้วยการปล่อย dealloc ที่ไม่ดี {} และนั่นก็เป็นเช่นนั้น!

"EXC_BAD_ACCESS" [การสลับไปยังกระบวนการ 330] ไม่มีหน่วยความจำในการเขียนโปรแกรมในขณะนี้: ไม่ปลอดภัยในการเรียก malloc

ฉันคิดว่ามันเป็นปัญหาที่ฉันพยายามจัดสรร ... ไม่ใช่ที่ที่ฉันพยายามที่จะปล่อย non-alloc, D'oh!


3

ฉันจัดการกับ EXC_BAD_ACCESS ได้อย่างไร

บางครั้งฉันรู้สึกว่าเมื่อมีข้อผิดพลาด EXC_BAD_ACCESS ถูกโยน xcode จะแสดงข้อผิดพลาดในระดับ main.m ให้ไม่มีข้อมูลเพิ่มเติมของที่เกิดความผิดพลาด (บางครั้ง)

ในช่วงเวลานั้นเราสามารถตั้งค่าเบรกพอยต์เจ๋ง ๆ ใน Xcode เพื่อที่ว่าเมื่อมีข้อยกเว้นจุดพักจะถูกวางไว้และจะใกล้ชิดโดยตรงกับผู้ใช้ที่เกิดความผิดพลาดในบรรทัดนั้น

ป้อนคำอธิบายรูปภาพที่นี่


2

NSAssert () การเรียกใช้เพื่อตรวจสอบพารามิเตอร์ของเมธอดนั้นค่อนข้างมีประโยชน์สำหรับการติดตามและหลีกเลี่ยงการผ่าน nils เช่นกัน


2

ฉันเพิ่งมีปัญหานี้ สำหรับฉันเหตุผลก็คือการลบวัตถุที่มีการจัดการ CoreData และพยายามที่จะอ่านหลังจากนั้นจากที่อื่น


2

ฉันได้ทำการดีบั๊กและสร้างรหัสใหม่เพื่อแก้ไขข้อผิดพลาดนี้ในช่วงสี่ชั่วโมงที่ผ่านมา โพสต์ด้านบนทำให้ฉันเห็นปัญหา:

ทรัพย์สินก่อน:

startPoint = [[DataPoint alloc] init] ;
startPoint= [DataPointList objectAtIndex: 0];
x = startPoint.x - 10; // EXC_BAD_ACCESS

คุณสมบัติหลังจาก:

startPoint = [[DataPoint alloc] init] ;
startPoint = [[DataPointList objectAtIndex: 0] retain];

ลาก่อน EXC_BAD_ACCESS

ขอบคุณมากสำหรับคำตอบของคุณ ฉันดิ้นรนกับปัญหานี้มาทั้งวัน คุณเจ๋งมาก!


4
คุณไม่ได้เขียนทับจุดเริ่มต้นทันทีหรือ ฉันไม่คิดว่าคุณต้องการบรรทัดแรกเลย
toxaq

2
ไม่จำเป็นต้องจัดสรรและกำหนดค่าเริ่มต้นให้กับตัวแปรหากคุณจะเขียนทับตัวแปรอื่นทันที คุณเพิ่งรั่ววัตถุในการมอบหมายครั้งแรก
dreamlax

2

เพียงเพิ่ม

Lynda.comมีดีวีดีที่ยอดเยี่ยมที่เรียกว่า

การฝึกอบรมที่จำเป็นสำหรับ iPhone SDK

และบทที่ 6 บทที่ 3 มีเนื้อหาเกี่ยวกับEXEC_BAD_ACCESSและทำงานกับซอมบี้

มันยอดเยี่ยมสำหรับฉันที่จะเข้าใจไม่ใช่แค่รหัสข้อผิดพลาด แต่ฉันจะใช้ Zombies เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับวัตถุที่วางจำหน่ายได้อย่างไร


2

เพื่อตรวจสอบข้อผิดพลาดที่อาจเป็น

ใช้ NSZombieEnabled

วิธีเปิดใช้งานเครื่องมืออำนวยความสะดวก NSZombieEnabled ในแอปพลิเคชันของคุณ:

เลือกโครงการ> แก้ไข Active Executable เพื่อเปิดหน้าต่างข้อมูล executable คลิกอาร์กิวเมนต์ คลิกปุ่มเพิ่ม (+) ในส่วน“ ตัวแปรที่จะตั้งค่าในสภาพแวดล้อม” ป้อน NSZombieEnabled ในคอลัมน์ชื่อและ YES ในคอลัมน์ค่า ตรวจสอบให้แน่ใจว่าได้เลือกเครื่องหมายถูกสำหรับรายการ NSZombieEnabled

ฉันพบคำตอบนี้บน iPhoneSDK


2

ฉันรู้ว่าสิ่งนี้ถูกถามเมื่อไม่นานมานี้ แต่หลังจากอ่านกระทู้นี้ฉันพบวิธีแก้ปัญหาสำหรับ XCode 4.2: ผลิตภัณฑ์ -> แก้ไขโครงการ -> แท็บการวินิจฉัย -> เปิดใช้งานวัตถุซอมบี้

ช่วยฉันค้นหาข้อความที่ส่งไปยังวัตถุที่จัดสรรคืน


2

เมื่อคุณมีการเรียกซ้ำแบบไม่สิ้นสุดฉันคิดว่าคุณสามารถมีข้อผิดพลาดนี้ได้เช่นกัน นี่เป็นกรณีสำหรับฉัน


1

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


1

ฉันได้รับเพราะฉันไม่ได้ใช้[self performSegueWithIdentifier:sender:]และ-(void) prepareForSegue:(UIstoryboardSegue *)ถูกต้อง


1

อย่าลืม@สัญลักษณ์เมื่อมีการสร้างเงื่อนไขการรักษาC-stringsเป็นจะทำให้เกิดNSStringsEXC_BAD_ACCESS

ใช้สิ่งนี้:

@"Some String"

มากกว่านี้:

"Some String"

PS - โดยทั่วไปแล้วเมื่อมีการเติมเนื้อหาarrayของระเบียนที่มีจำนวนมาก


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