คำตอบคือ ... ดี ... ง่ายๆ ความเรียบง่ายและสม่ำเสมอในความเป็นจริง
Objective-C เป็นแบบไดนามิกอย่างแท้จริงในขณะที่วิธีการจัดส่ง โดยเฉพาะอย่างยิ่งการจัดส่งทุกวิธีจะต้องผ่านจุดความละเอียดวิธีการแบบไดนามิกเดียวกันกับวิธีการอื่น ๆ ในรันไทม์การใช้งานทุกวิธีจะมีการเปิดเผยที่เหมือนกันทุกประการและ API ทั้งหมดที่จัดเตรียมโดยรันไทม์ Objective-C ที่ทำงานกับเมธอดและตัวเลือกจะทำงานเหมือนกันในทุกวิธี
ดังที่หลายคนตอบ (ทั้งที่นี่และในคำถามอื่น ๆ ) รองรับวิธีการส่วนตัวแบบเวลาคอมไพล์ หากคลาสไม่ได้ประกาศวิธีการในอินเทอร์เฟซที่เปิดเผยต่อสาธารณะวิธีนั้นอาจไม่มีอยู่ด้วยเช่นกันเนื่องจากโค้ดของคุณเกี่ยวข้อง กล่าวอีกนัยหนึ่งคุณสามารถบรรลุชุดค่าการมองเห็นที่หลากหลายตามที่ต้องการในเวลารวบรวมโดยจัดระเบียบโครงการของคุณให้เหมาะสม
การทำซ้ำฟังก์ชันเดียวกันในรันไทม์มีประโยชน์เพียงเล็กน้อย มันจะเพิ่มความซับซ้อนและค่าใช้จ่ายจำนวนมหาศาล และถึงแม้จะมีความซับซ้อนทั้งหมดนี้ก็ยังไม่สามารถป้องกันไม่ให้นักพัฒนาซอฟต์แวร์ที่ไม่เป็นทางการทั้งหมดดำเนินการตามวิธีการ "ส่วนตัว" ของคุณ
แก้ไข: หนึ่งในสมมติฐานที่ฉันสังเกตเห็นคือข้อความส่วนตัวจะต้องผ่านรันไทม์ซึ่งส่งผลให้ค่าใช้จ่ายสูงขึ้น นี่คือความจริงอย่างแน่นอน?
ใช่แล้ว. ไม่มีเหตุผลที่จะสมมติว่าผู้ใช้คลาสไม่ต้องการใช้คุณลักษณะ Objective-C ทั้งหมดที่ตั้งค่าไว้ในการนำไปใช้งานและนั่นหมายความว่าการจัดส่งแบบไดนามิกจะต้องเกิดขึ้น อย่างไรก็ตามไม่มีเหตุผลใดที่ทำให้เมธอดส่วนตัวไม่สามารถส่งโดยตัวแปรพิเศษobjc_msgSend()
ได้เนื่องจากคอมไพเลอร์จะรู้ว่ามันเป็นแบบส่วนตัว กล่าวคือสามารถทำได้โดยการเพิ่มตารางวิธีการส่วนตัวเท่านั้นในClass
โครงสร้าง
จะไม่มีวิธีใดที่เมธอดส่วนตัวจะลัดวงจรการตรวจสอบนี้หรือข้ามรันไทม์?
ไม่สามารถข้ามรันไทม์ได้ แต่รันไทม์ไม่จำเป็นต้องทำการตรวจสอบเมธอดส่วนตัวใด ๆ
ที่กล่าวว่าไม่มีเหตุผลที่บุคคลที่สามไม่สามารถเรียกobjc_msgSendPrivate()
ใช้วัตถุโดยเจตนานอกเหนือจากการใช้งานวัตถุนั้นและบางสิ่ง (เช่น KVO) จะต้องทำเช่นนั้น ที่จริงแล้วมันจะเป็นเพียงแบบแผนและดีกว่าในทางปฏิบัติเล็กน้อยกว่าการใส่คำนำหน้าตัวเลือกเมธอดส่วนตัวหรือไม่กล่าวถึงในส่วนหัวของอินเทอร์เฟซ
แม้ว่าการทำเช่นนั้นจะทำลายธรรมชาติที่มีพลวัตของภาษาอย่างแท้จริง ทุกวิธีการจัดส่งจะไม่ผ่านกลไกการจัดส่งที่เหมือนกันอีกต่อไป แต่คุณจะถูกปล่อยให้อยู่ในสถานการณ์ที่วิธีการส่วนใหญ่ทำงานในลักษณะเดียวและมีเพียงหยิบมือเล็ก ๆ ที่แตกต่างกัน
สิ่งนี้ขยายไปไกลกว่ารันไทม์เนื่องจากมีกลไกมากมายใน Cocoa ที่สร้างขึ้นจากพลวัตที่สอดคล้องกันของ Objective-C ตัวอย่างเช่นทั้งการเข้ารหัสค่าคีย์และการสังเกตค่าคีย์อาจต้องได้รับการแก้ไขอย่างมากเพื่อรองรับเมธอดส่วนตัวซึ่งส่วนใหญ่จะเกิดจากการสร้างช่องโหว่ที่ใช้ประโยชน์ได้ไม่เช่นนั้นวิธีการส่วนตัวจะเข้ากันไม่ได้