NSParameterAssert คืออะไร?


คำตอบ:


115

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

- (void)someMethod:(id)someObjectThatMustNotBeNil
{
  // Make sure that someObjectThatMustNotBeNil is really not nil
  NSParameterAssert( someObjectThatMustNotBeNil );
  // Okay, now do things
}

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

NSParameterAssert สามารถใช้เพื่อทดสอบว่านิพจน์ใด ๆ ประเมินว่าเป็นจริงอย่างไรก็ตามคุณสามารถใช้มันได้เช่นกัน:

NSParameterAssert( index >= 0 ); // ensure no negative index is supplied

เอกสารของ Apple สำหรับมาโคร NSParameterAssert ()


1
ตรวจสอบให้แน่ใจว่าได้ตรวจพบข้อยกเว้นในโค้ดของคุณไม่เช่นนั้นหาก Assert เป็นจริงแอปของคุณจะขัดข้อง
lucius

14
@lucius: การยืนยันไม่ได้ถูกใช้เพื่อตรวจสอบเงื่อนไขในแอปพลิเคชันแบบกระจายพวกเขาจะตรวจจับข้อผิดพลาดระหว่างการพัฒนา ทำให้บางสิ่งบางอย่างขัดข้องในสภาพที่ไม่ดี (เช่นเต้าเสียบที่ไม่ได้เชื่อมต่อกับหัวปากกา) แทนที่จะล้มเหลวโดยเงียบจะช่วยให้คุณพบปัญหาได้ แต่เนิ่นๆ หลายคนปิดใช้งานสิ่งเหล่านี้ในเวลาแจกจ่ายผ่านมาโครหรือ #ifdefs
Brad Larson

5
@lucius - เป้าหมายคือทำให้แอปพลิเคชันยกเลิกเมื่อไม่เป็นไปตามเงื่อนไขเบื้องต้น สิ่งนี้ช่วยให้โปรแกรมเมอร์รู้ได้ทันทีว่าเขาทำอะไรผิด เพื่อให้แน่ใจว่าไม่มีการประเมินการยืนยันใน Cocoa คุณสามารถกำหนดมาโคร NS_BLOCK_ASSERTIONS สิ่งนี้จะปิดใช้งาน แต่แนวคิดคือการรักษาผลข้างเคียงหรือโค้ดที่ช้าจากการดำเนินการแทนที่จะป้องกันการหยุดทำงาน - โดยการผลิตการยืนยันไม่ควรทริกเกอร์หากใช้อย่างถูกต้อง
Jason Coco

1
เป็นไปได้ไหมที่จะลบคำยืนยันเหล่านี้ออกด้วยวิธีง่ายๆเมื่อทำการสร้างการผลิต IMHO ใช้ดีที่สุดในระหว่างการพัฒนาเพื่อตรวจจับข้อผิดพลาดในการเขียนโปรแกรม (ตามที่กล่าวไว้ในความคิดเห็นด้านบน)
Johan Karlsson

5
@JohanKarlsson เป็นไปได้และตั้งค่าโดยค่าเริ่มต้นในเทมเพลตเวอร์ชันปัจจุบัน (ซึ่งย้อนกลับไปได้ค่อนข้างไกล) ในการReleaseกำหนดค่า คุณสามารถควบคุมสิ่งนี้ได้โดยตั้งค่าการENABLE_NS_ASSERTIONSสร้างใน Xcode เวอร์ชันใหม่กว่าหรือกำหนดNS_BLOCK_ASSERTIONSมาโครและตั้งค่าเป็น 1 ใน Xcode 5 มีการตั้งค่าโปรเจ็กต์ * เปิดใช้งานการยืนยันพื้นฐาน "ที่ตั้งค่าการสร้างและค่าเริ่มต้นเป็นYesในDebugและNoในReleaseการกำหนดค่า
Jason Coco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.