الهدف C: بالنظر إلى معرف الفصل ، هل يمكنني التحقق مما إذا كانت هذه الفئة تنفذ بروتوكول معين؟ أو لديه محدد معين؟

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

سؤال

أرغب في استخدام هذا لمصنع كائن: بالنظر إلى سلسلة ، قم بإنشاء فئة ، وإذا كانت هذه الفئة تدعم بروتوكول (مع طريقة Create ()) ، فقم بتوضيح الفصل وإنشاء المكالمة.

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

المحلول

Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}

ومع ذلك ، هل لي أن أشير إلى عدد قواعد الهدف-C الفظيعة التي تنكسرها عن طريق القيام بما سبق؟ على سبيل المثال ، يجب ألا تكون أبدًا طرقًا على مثيل مخصص ولكن غير مخصص. سوف يمنحك محلل XCode Static كل أنواع التحذيرات حول تسرب الذاكرة.

خيار أفضل هو هذا:

[[[klass alloc] init] create];

لكن يبدو أنك تشير إلى أنك لا تريد الاتصال بـ init.

يمكنك النظر في طريقة الفصل: [klass create], ، والتي ستعود إلى حالة غير مملوكة klass. ثم يمكنك التحقق فقط [klass respondsToSelector:@selector(create)] قبل تسميته.

نصائح أخرى

NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top