سؤال

أنا أتم توسيع فئة من مكتبة خارجية. هنا هو رمزي:

ملف الرأس: مدير + mycategory.h

#import "Manager.h"
#import "Element.h"

@interface Manager (myCategory) 
- (Element*) elementWithTag:(NSInteger)tag; 
@end

ملف التنفيذ: مدير + MyCategory.h

@implementation Manager (myCategory) 

- (Element*) elementWithTag:(NSInteger)tag {
    ...
}

@end

الآن هنا هو كيف يمكنني استخدام هذه الفئة:

#import "Manager+MyCategory.h"

@implementation myClass 

- (void) myFunction:(NSInteger)tag {
   Manager* myManager = [[Manager alloc] init];
   Element* = [myManager elementWithTag:tag];

   ...

   [myManager release];
}

@end

عندما أرخص ليس لدي أي تحذيرات، لكن عندما أقوم بتشغيل برنامجي، أحصل على الخطأ التالي:

*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]:

يتم استيراد ملف الرأس (IE Manager + MyCategory.h) بشكل صحيح ولكن يبدو أن الرابط مع ملف التنفيذ لم يتم ذلك. إذا قمت باستبدال #import "Manager + MyCathy **. H **" بواسطة #import "Manager + MyCathy **. M **" في صفي يعمل بشكل صحيح.

يمكن لأي شخص أن يفسرني ما نسيت؟ شكرا

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

المحلول

الفئات لا تعمل بشكل جيد مع UNIX التقليدية ثابتة المكتبات.

إذا كان هذا هو حالتك، يبدو أنه يمرر خيار -OBJC إلى رابط يحل المشكلة.

التفاح الفني Q & A QA1490 يفسر كل شيء.

نصائح أخرى

أظن أنك نسيت إضافة مدير + MyCathy.m إلى الهدف المتشابط في Xcode. لا تحصل على خطأ رابط لأن جميع الرموز موجودة ولا يوجد تحذير مترجم لأنك تضمنت ملفات الرأس المناسبة، ولكن في وقت التشغيل تنفيذ elementWithTag: الطريقة مفقودة.

الاعتذار، لا يمكن أن تضيف هذا كتعليق ...

فقط للاختبار، قد ترغب في إضافة وظيفة extern C المعلنة في الرأس وتنفيذها في ملف .m. إذا استدعيت وظيفة C هذه ضمن رمز الاختبار الخاص بك، فهذا إرادة توليد خطأ رابط بسبب معرف لم يتم حلها.

هذا يمكن أن يسهل التحقيق في المشكلة لأنه يوفر ملاحظات فورية وقد تولد بعض الأدلة الإضافية لماذا لا يتم تضمين الملف.

بالنظر إلى الإطار الزمني، سأفترض أنك قمت بذلك، ولكن فقط في حالة ... تأكد من أن قمت بتنظيف الهدف، وإغلاق Xcode، ثم إعادة فتح. لقد أتيحت لملفات المشروع تالفة في الذاكرة والتصرف بشكل غريب.

بارني

كان لدي هذه المشكلة عند الترقية إلى XCode 4.

لإصلاح اضطررت إلى فصل تعريف فئة بلدي إلى .m منفصل و. h - xcode 3 يبدو بخير مع التنفيذ والواجهة يجري في .h ... ولكن لا fussy xcode 4 شرجي.

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