سؤال

أعلم أن الهدف - C يستخدم ربط ديناميكي لجميع مكالمات الأسلوب. كيف يتم تنفيذ هذا؟ يقوم الهدف - C "بدوره إلى رمز C" قبل التجميع واستخدام مؤشرات (باطلة *) لكل شيء؟

هل كانت مفيدة؟

المحلول

من الناحية النظرية، ما يجري هو أن هناك مكتبة المرسل (يشار إليها عادة باسم وقت التشغيل الهدف)، وتحول المحول البرمجي شيئا مثل هذا:

[myObject myMethodWithArg:a andArg:b ];

إلى

//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);

ثم يتعثر وقت التشغيل مع جميع الربط والإرسال، ويجد وظيفة مناسبة، ويستدعي مع تلك Args. ببساطة يمكنك التفكير في ذلك نوعا من البحث عن علامة تجزئة؛ بالطبع هو أكثر تعقيدا كثيرا في الواقع.

هناك الكثير من القضايا المتعلقة بالأشياء مثل توقيعات الأسلوب (C لا ترميز أنواع لذلك يحتاج وقت التشغيل للتعامل معها).

نصائح أخرى

يتم تطبيق كل طريقة جهة موضوعية "تحت غطاء محرك السيارة" كدينة C (سارية). تحتوي الطريقة على رسالة (سلسلة نصية) مرتبطة به، ويحتوي الفصل على جدول بحث يطابق سلسلة الرسائل مع وظيفة C. لذلك عند استدعاء طريقة جهة مهدف، ما يحدث حقا هو إرسال سلسلة رسالة إلى الكائن، والكائن يبحث عن وظيفة C المرتبط بها في جدول البحث عن طريقة الفئة ويعمل ذلك.

هناك المزيد معه مع الهدف C، مثل كيف تعامل الكائنات مع الرسائل التي لا يفهمونها عن طريق إعادة توجيهها، وكيفية تخزينها من البحث في الأسلوب، وهلم جرا، ولكن هذا هو الأساسيات.

C ++ متشابه، باستثناء الفئة وجود جدول الرسائل، يحتوي على شيء آخر يسمى "vtable"، ودعت طريقة غير عبر سلسلة نصية، ولكن عبر إزاحة في VTable. هذا هو شكل ملزم ثابت، وتسريع التنفيذ إلى حد ما، ولكنه أقل مرونة من الربط الديناميكي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top