كيف يمكنني حيوي إنشاء محدد في وقت التشغيل مع الهدف C ؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

اعرف كيفية إنشاء SEL في وقت التحويل البرمجي باستخدام @selector(MyMethodName:) ولكن ما أريد القيام به هو إنشاء محدد بشكل حيوي من NSString.هل هذا ممكن ؟

ما يمكنني القيام به:

SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];

ما أريد القيام به:(البرمجية الزائفة, ومن الواضح أن هذا لا يعمل)

SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];

لقد تم البحث أبل API مستندات, ولكن لم يتم العثور على الطريقة التي لا تعتمد على وقت التحويل البرمجي @selector(myTarget:) بناء الجملة.

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

المحلول

أنا لست الهدف-ج مبرمج, مجرد متعاطف لكن ربما NSSelectorFromString هو ما تحتاجه.ذكر explicity في وقت الرجوع يمكنك استخدام تحويل سلسلة إلى محدد.

نصائح أخرى

وفقا كسكودي الوثائق ، psuedocode أساسا يحصل على ذلك الحق.

الأكثر فعالية لتعيين قيم SEL المتغيرات في وقت الترجمة مع @محدد() التوجيه.ومع ذلك, في بعض الحالات, قد تحتاج إلى تحويل سلسلة أحرف إلى محدد في وقت التشغيل.هذا يمكن القيام به مع NSSelectorFromString وظيفة:

setWidthHeight = NSSelectorFromString(aBuffer);

تحرير:المشكله بطيء جدا.:P

أود أن أقول أن انها قليلا أكثر تعقيدا من السابق إجابات المستجيبين قد توحي...إذا كنت حقا تريد حقا أن إنشاء محدد...لا مجرد "دعوة" التي "لديها حول زرع"...

تحتاج إلى إنشاء وظيفة المؤشر الذي سيتم استدعاؤه من قبل جهاز "جديد" طريقة..حتى طريقة مثل [self theMethod:(id)methodArg];, كنت أكتب...

void (^impBlock)(id,id) = ^(id _self, id methodArg) { 
     [_self doSomethingWith:methodArg]; 
};

ومن ثم تحتاج إلى توليد IMP كتلة حيوي, في هذا الوقت, يمر, "الذات" ، SEL, أي الحجج...

void(*impFunct)(id, SEL, id) = (void*) imp_implementationWithBlock(impBlock);

وإضافته إلى الفئة الخاصة بك, جنبا إلى جنب مع دقيق طريقة التوقيع كله مصاصة (في هذه الحالة "v@:@", باطلة العودة ، الكائن المتصل ، وجوه الحجة)

 class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");

يمكنك ان ترى بعض الأمثلة الجيدة على هذا النوع من وقت التشغيل الاشكالات, في واحدة من بلدي repos هنا.

أعرف أن هذا قد تم الرد عليها لفترة طويلة مضت ، ولكن ما زلت أريد أن أشاطركم.ويمكن أن يتم ذلك باستخدام sel_registerName أيضا.

رمز المثال في السؤال يمكن إعادة كتابة مثل هذا:

SEL selector = sel_registerName("doWork:");
[myobj respondsToSelector:selector];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top