سؤال

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

مثال مندوب (للوضوح، شكرا OLE!):

@protocol SomeDelegate <NSObject>
  - (void)someDelegateMessage;
@end

مثال الفئة:

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

ومع التنفيذ النموذجي خلاف ذلك

@implement NSObject (SomeCategory)
  - (void)someDelegateMessage {}
@end

عندما أحاول فعلا هذا، أحصل على تحذير لكل طريقة NSOBJECT:

تحذير: تنفيذ غير مكتمل للفئة "Somecategory"

تحذير: تعريف الطريقة ل "-Description" غير موجود

...

تحذير: تعريف الطريقة ل "-عراسك:" غير موجود

تحذير: الفئة "الفئة السمنية" لا تنفذ بالكامل بروتوكول "NSOBJECT"

يعمل بشكل جيد إذا قمت بإزالة <SomeDelegate> من الإعلان، ولكن بالطبع غير معترف به NSOBJECT

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

المحلول

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

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

@implementation NSObject (SomeCategory_Impl)
  - (void)someDelegateMessage {}
@end

إذا قمت بذلك، NSObject سيتم النظر في المطابقة مع <SomeDelegate> في تجميع الوقت، والتحقق من وقت التشغيل ل someDelegateMessage ستنجح. ومع ذلك، conformsToProtocol: سوف تفشل الشيكات وقت التشغيل.

بالطبع، يجب عليك ملف علة طلب هذه الطرق المعلنة على الطبقة الأساسية لا تولد تحذيرات.

نصائح أخرى

أي فرصة إعلان بروتوكولك يشمل NSObject بروتوكول؟ مثله:

@protocol SomeDelegate <NSObject>
...

هذا هو المكان الذي تأتي فيه التحذيرات لأن فئةك الآن لا تنفذ البروتوكول الكامل. في رمز الاختبار، كتبت للتو، إزالة NSObject من البروتوكول يزيل تحذيرات المحول البرمجي.

إذا كنت تريد إخراج المحول البرمجي حول الإرسالu003CNSObject> الرسائل (ومن المهم أن تتذكر أن هذا اسم البروتوكول، وليس اسم الفصل) ثم استخدم فقط متغيرات "المعرف"، وليس "معرف" لأن هذا هو الذي تخبره صراحة بالمترجم "هذا هو كائن ينفذ فقط البروتوكول الأحيي" وبعد

بالتناوب، استخدم NSOBJECT كنوع المتغير الخاص بك بدلا من ذلك.

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