إنشاء فئة في وقت التشغيل - لماذا NSClassFromString وعودة objc_getclass شيء؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولقد حاولت استخدام كل من:

NSClassFromString and objc_getclass 

وبالعودة فئة، حتى أتمكن من إنشائه في وقت التشغيل، ولكن كلا الدالات بإرجاع صفر لبعض الفئات، على سبيل المثال "TestClass". لاحظ أن NSClassFromString يعمل بالنسبة لي ل99٪ من الفصول.

إذا أضيف

[TestClass class];

وقبل أن ندعو NSStringFromClass أو objc_getclass ذلك، فإنه يعمل. وإذا حاولت فقط إنشاء فئة باستخدام مرجع الدرجة، أي بمعنى:.

[TestClass alloc];

وكان يعمل أيضا. فكيف يمكنني إجبار الطبقة لتحميل في وقت التشغيل وبالتالي فإن NSClassFromString أو objc_getclass لن يعود شيء؟

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

المحلول

وأنا واجهت نفس المشكلة. في حالتي كان لي كود الذي كان يبحث عن الطبقة باستخدام

Class aClass = objc_getClass("Foo");

والتي عملت عندما كانت الطبقة فو في نفس حزمة المشروع بلدي AppDelegate.

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

وعندما انتقلت الطبقة فو في libFooBar وobjc_getClass ( "فو") عاد الآن لا شيء بدلا من فئة فو.

لحل هذا، أنا وضعت في الدعوة إلى فئة أنا مهتم بحيث يتم تسجيل الفئات من libFooBar مع الهدف-C وقت التشغيل. فعلت ذلك كما يلي:

Foo* foo = [[Foo alloc] init];
[foo release];
Class aClass = objc_getClass("Foo");

والآن objc_getClass ( "فو") إرجاع الطبقة فو مرة أخرى بدلا من لا شيء.

ويسعني إلا أن نفترض أن الطبقات مكتبة ثابتة لم يتم تسجيل حتى يتم إجراء مكالمة إلى واحدة من الفئات في مكتبة ثابتة.

نصائح أخرى

ووالهدف-C وقت التشغيل المرجعي يمكن أن تساعدك على هنا. على سبيل المثال، وثائق objc_getClass تقول، "إن الهدف من الدرجة للفئة المسمى، أو لا شيء إذا لم يتم تسجيل فئة ذات الهدف-C وقت التشغيل." ونظروا حولهم لمناقشة تسجيل تجد هذا نبأ سار في objc_getClassList:

<اقتباس فقرة>   

و"مكتبة وقت التشغيل الهدف-C تسجل تلقائيا كل الفئات المحددة في التعليمات البرمجية المصدر. يمكنك إنشاء تعريفات فئة في وقت التشغيل وتسجيلهم مع وظيفة objc_addClass."

(وبالطبع مستندات قديمة لأن إهمال objc_addClass، objc_allocateClassPair وobjc_registerClassPair في مكانها.)

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

وكان لي لإضافة فئة (على سبيل المثال TestClass.m) يدويا إلى إعدادات الإنشاء. بناء مراحل> مصادر ترجمة> +> TestClass.m

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