لماذا يستخدم iPhone SDK الفئات، بدلا من البروتوكولات، لبعض المندوبين؟

StackOverflow https://stackoverflow.com/questions/900335

سؤال

فهمي هو أن البروتوكولات تشبه واجهات بلغات أخرى - أنها تعلن الطرق المتوقعة - بينما تسمح لك الفئات بإضافة طرق جديدة إلى الأنواع الموجودة (ربما حتى حتى الأنواع التي لا تملكها.)

لماذا، إذن، هل يستخدم iPhone SDK في بعض الأحيان الفئات لإعلان أنواع المندوبين؟ عادة ما أتوقع أن يكتب جميع المندوبينu003CMyDelegateProtocol> ولكن هناك العديد من الأمثلة التي ليس هذا هو الحال.

على سبيل المثال، انظر nsurlconnection. يتم كتابة مندوبها "ID" ويتم الإعلان عن "العقد" ك فئة على nsobject (nsurlconnectiondelegate).

هكذا: ما هو الدافع لاستخدام الفئات في هذه الحالات؟

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

المحلول

أدخل الهدف - C 2.0 توجيه البروتوكول التضمين في البروتوكول، مما يتيح لك إعلان أساليب بروتوكول معينة أن تكون اختيارية. قبل obj-c 2.0، تم استخدام الفئات للسماح بطرق المفوض الاختيارية (على وجه التحديد، فئات على NSOBJECT، والتي تسمى البروتوكولات غير الرسمية).

تخميني هو أن معظم استخدام الفئة بدلا من البروتوكول في iPhone SDK هو Holdover من فئات MAC المكافئة. علي سبيل المثال، NSURLConnection يوجد في كل من Mac و iPhone SDKs، لذلك من المحتمل أن يشارك الكود. نظرا لأن Apple لم تمر بعد لتغيير جميع فئات MAC لاستخدام البروتوكولات الرسمية، فقد تركنا مع عدم تناسق إلى حد ما.

نصائح أخرى

حتى تنقيح الهدف - C الذي تم طرحه مع OS X 10.5 و iPhone SDK، يسمى "Objective-C 2.0"، يمكن للمرء فقط إجراء البروتوكولات الاختيارية باستخدام الفئات. في Objective-C 2.0، تمت إضافة كلمة رئيسية جديدة من poptional في البروتوكولات لتمييز الأساليب التي كانت اختيارية (الباقي مطلوب ضمنيا).

لذلك أعتقد أن ما تراه هو تعليق بسيط من الأيام السابقة قبل الكلمة الأساسية oventional.

تحرير: للإجابة على متابعة المتابعة التي ظهرت في السؤال الأصلي: يحفز الدافع لاستخدام فئة على NSOBJECT / ID لبروتوكول غير رسمي جزئيا إلى المستند والجماعة التي قد تتصل بها الكائن في مصدر بياناتها (أو تفويض أو أي شيء) وبدرجة أقل لتجنب تحذيرات المترجم التي تدعو الأساليب التي لا يعرفها المترجم ستكون موجودة في الكائن الذي يتلقى المكالمة. تخيل أن يكون الشخص الذي ينفذ الفصل الذي يدعو طرق البيانات هذه - ربما ترغب في التحقق من أن الطريقة موجودة باستخدام [OBJ Reautstoselector: الموقع (My: DataSource: الطريقة :)] كلما كنت مهتما باتصال بي : DataSource: الطريقة: الطريقة على الكائن OBJ.

هذه إرث جاءت من الموضوع - C 1.0، لا يوجد لديه "طريقة بروتوكول اختياري".

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