الحصول على مؤشر لأسلوب فئة بحيث يمكن تمريره كرد اتصال إلى دالة C

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

سؤال

أنا أستخدم libssh2 ولدي وظيفة رد اتصال محددة خارج كائن SSHWrapper الخاص بي:

static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract);

من داخل كائن SSHWrapper الخاص بي، أقوم بما يلي، بتمرير وظيفة رد الاتصال عند مصادقة الجلسة:

/* Create a session instance */
LIBSSH2_SESSION *session = libssh2_session_init_ex(NULL, NULL, NULL, self);
while ((rc = libssh2_userauth_keyboard_interactive(session, userChar, &kbd_callback)) == LIBSSH2_ERROR_EAGAIN);

ما أتساءل عنه هو، هل من الممكن نقل kbd_callback() وظيفة داخل كائني، بحيث تكون طريقة فئة: +(void) kbd_callback:...?

إذا كان الأمر كذلك، فكيف يمكنني الحصول على عنوان تلك الوظيفة لتمريرها إلى الدالة C libssh2_userauth_keyboard_interactive()?

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

المحلول

النهج الذي تتبعه الآن معقول.ومع ذلك، فإن أساليب Objective-C هي في الواقع مجرد وظائف C.الشيء الرئيسي الذي يزيد من تعقيد النهج الذي تقترحه هو أنه يتضمن وسيطتين "مخفيتين"، self, ، و _cmd. self هو مثيل الكائن الذي يتم استدعاء الطريقة عليه، و _cmd هو المحدد للأسلوب.لا يمكنك تغييرها، ووجودها سيجعل من المستحيل جعل وسيطات وظيفتك تتطابق مع تلك المطلوبة لوظيفة رد الاتصال.

فقط في حالة ما إذا كان الأمر لا يزال مثيرًا للاهتمام بالنسبة لك، يمكنك الحصول على مؤشر دالة إلى طريقة Objective-C كما يلي:

IMP methodIMP = [self methodForSelector:@selector(someMethodThatTakesOneStringArgument:)];
void (*functionPointer)(id, SEL, NSString*) = (void (*)(id, SEL, NSString*))methodIMP;

// Then call it:
functionPointer(instance, @selector(someMethodThatTakesOneStringArgument:), aString);

يحرر:لقد نشرت برنامجًا بسيطًا وكاملًا يوضح هذا الرمز أثناء العمل هنا: https://Gist.github.com/2731937

نصائح أخرى

لا.وظيفة C الأساسية التي يتم إنشاؤها بواسطة + (void)method لا ينبغي أن يتم استدعاؤها مباشرة بهذه الطريقة.ما لم تكن معتادًا على وقت تشغيل Objective-C الأساسي، فإن العبث بوظائف IMP لن يؤدي إلا إلى وقوعك في المشاكل.

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