سؤال

ال IMP يمثل النوع في Objective-C مؤشر دالة، بقدر ما أفهم.هل هناك أي طريقة لجعل IMP من مؤشر الكتلة؟شكرا لأفكارك.

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

المحلول

منذ كتابة هذا، توجد الآن واجهة برمجة التطبيقات (API) في iOS وMac OS X والتي تسمح بتحويل الكتل إلى IMPs مباشرة.لقد كتبت أ مشاركة مدونة وصف واجهة برمجة التطبيقات (imp_implementationWithBlock()).


الكتلة هي في الواقع بنية تحتوي على القليل من البيانات الوصفية، وإشارة إلى الكود الموجود داخل الكتلة ونسخة من البيانات المنسوخة التي تم التقاطها داخل الكتلة.

وبالتالي، لا، لا توجد طريقة للتعيين مباشرة بين IMP ومرجع الكتلة.

عندما يتم تجميع استدعاء كتلة، يقوم المترجم بإصدار الترامبولين الذي يقوم بإعداد إطار المكدس ثم ينتقل إلى الكود القابل للتنفيذ داخل الكتلة.

لكن ما يمكنك فعله هو إنشاء IMP يعمل مثل هذا الترامبولين.فيما يلي، ستحتاج إلى IMP محدد لكل مجموعة من الوسائط وأنواع الإرجاع المراد استدعاؤها.إذا كنت بحاجة إلى جعل هذا عامًا، فستحتاج إلى استخدام التجميع.

لهذا، أقوم بإعداد مثيلات حظر فريدة لكل مثيل للفئة.إذا كنت ترغب في الحصول على كتلة عامة تعمل في جميع الحالات، فقم بإنشاء تجزئة SEL -> كتلة لكل فئة.

(1) ربط الكتل للعمل كعناصر IMP باستخدام آلية المراجع المرتبطة.شيء مثل:

void (^implementingBlock)(id s, SEL _c, int v) = ^(id s, SEL _c, int v) {
     // do something here
}

objc_setAssociatedObject(obj, SELToImp, [implementingBlock copy]));

(2) تنفيذ IMP الترامبولين شيء من هذا القبيل:

void void_id_sel_intTramp(id self, SEL _cmd, int value) {
    int (^block)(id s, SEL _c, int v) = objc_getAssociatedObject(self, _cmd);
    block(self, _cmd, value);
}

(3) قم بحشو الترامبولين أعلاه لأي محدد عبر واجهة برمجة التطبيقات لوقت تشغيل Objective-C (انظر method_setImplementation ومثل)

تحفظات:

  • تمت كتابة هذا في StackOverflow.سيكون الكود الحقيقي مشابهًا، لكن من المحتمل أن يكون مختلفًا قليلاً.

  • تعد [نسخة حظر التنفيذ] أمرًا بالغ الأهمية؛تبدأ الكتل حياتها على المكدس (عادةً)

نصائح أخرى

وأعتقد مايك الرماد، مع بعض المساعدة من لاندون فولر، قد حل هذا عن الحالة العامة، بما في ذلك دائرة الرقابة الداخلية، والتي هي أكثر صعوبة. لديه فئة على جيثب التي سوف تتحول إلى كتلة مؤشر دالة.

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

وUPDATE: والآن هو imp_implementationWithBlock() هناك كما المشار إليها أعلاه

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