الهدف C: بالنظر إلى معرف الفصل ، هل يمكنني التحقق مما إذا كانت هذه الفئة تنفذ بروتوكول معين؟ أو لديه محدد معين؟
-
23-09-2019 - |
سؤال
أرغب في استخدام هذا لمصنع كائن: بالنظر إلى سلسلة ، قم بإنشاء فئة ، وإذا كانت هذه الفئة تدعم بروتوكول (مع طريقة 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];
}
لا تنتمي إلى StackOverflow