سؤال

النسخة القصيرة هي أن لدي بروتوكول يحتوي على معلمة اختيارية. عندما أقوم ببناء فئة تنفذه باستخدام iPhone SDK 3.x، فإنه يتجمع بشكل جيد، مع عدم وجود أخطاء أو تحذيرات. عندما استخدمت 2.x SDK أحصل على التحذير التالي:

Class.m:68: warning: property 'field' requires method '-field' to be defined - use @synthesize, @dynamic or provide a method implementation

يعمل بشكل جيد فقط في كلتا الحالتين.

لذلك سؤالان:

  1. ما هي الطريقة الصحيحة لإصلاح التحذير؟ أضفت @dynamic إلى التنفيذ الذي ليس صحيحا حقا لأن العقار ليس هناك حقا.
  2. لماذا يعمل في SDK 3.x ولكن ليس 2.x؟ يقول المستندات "على Mac OS X V10.5، قد لا تتضمن البروتوكولات خصائص معلنة اختيارية." من الواضح أن هذا ليس بالضبط القضية هنا.

إليك عينة سريعة من هذا النوع من التعليمات البرمجية التي يجب أن تجعل الأمور أكثر وضوحا قليلا إذا لم أكن واضحا تماما.

@protocol MyProtocol
  @required
    - (void) method:(NSString*)param;
  @optional
    @property (nonatomic,retain) NSString* field;
@end

@interface MyClass : NSObject<MyProtocol> {
}
- (void) method:(NSString*)param;
@end
هل كانت مفيدة؟

المحلول

لا يتطابق SDK iPhone مطابقا تماما لأي إصدار ثقافي من Mac OS X. بوضوح يتم تضمين إصدار أحدث من مجموعة الأدوات مع SDK 3 الذي يشبه واحد من Snow Leopard.

نصائح أخرى

طريقة Simnple لإزالة التحذير هي إضافة

FieldDynamic الحقل؛

لتنفيذك. يخبر المحول البرمجي بأنك ستوفر التنفيذ ديناميكيا، والتي لن تكون لديك خاصية اختيارية، ولكن يجب أن تغلق المحول البرمجي.

تم تقديم @ poptional في الهدف-ج 2.0 لذلك لن يكون قابلا للتطبيق بالنسبة للإصدارات القديمة من SDK. أفضل رهان لديك هو تحديد ما إذا كان يجب أن يكون حاضرا (ربما لا) ثم #ifdef ذلك

#if __OBJC2__
@optional
@property ...
#endif

ثم يجب أن يترجم فقط تحت OBJC2، ولن يكون موجودا في الأنظمة القديمة كجزء من البروتوكول نفسه.

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