سؤال

أنا أكتب موضوعي C-class ولكنه يستخدم API مكتوب في C.هذا هو الغالب بخير خلط ج المكالمات مع الهدف جيم المكالمات يسبب بعض المشاكل.

ومع ذلك واحدة من استدعاء API يتطلب الإتصال الطريقة (على سبيل المثال):

success = CFHostSetClient(host, MyCFHostClientCallBack, &context);

حيث MyCFHostClientCallBack هو C وظيفة محددة مثل هذا:

static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);
  1. يمكن/كيف يمكنني الاتصال موضوعي-ج الأسلوب في مكان من هذا ؟
  2. يمكن/ينبغي أن تخلط C الوظائف مع الهدف جيم المكالمات ؟
  3. كيف يمكنني خلط C الوظائف مع الهدف-C الأساليب ؟
هل كانت مفيدة؟

المحلول

خلط C و الهدف-C أساليب وظيفة ممكن هنا مثال بسيط يستخدم سكليتي API داخل التطبيق فون:(بالطبع الموقع)

تحميل ملف مضغوط (09_MySQLiteTableView.zip)

ج وظائف تحتاج إلى أن أعلن خارج @implementation في موضوعي-ج (.م) الملف.

int MyCFunction(int num, void *data)
{
     //code here...
}

@implementation

- (void)MyObjectiveCMethod:(int)number withData:(NSData *)data
{
      //code here
}

@end

لأن الدالة C هو خارج @implementation فإنه لا يمكن استدعاء أساليب مثل

[self doSomething]

وليس لديه إمكانية الوصول إلى ivars.

هذا ويمكن عمل حول طالما الإتصال وظيفة يأخذ userInfo أو context نوع المعلمة عادة من نوع void*.وهذا يمكن أن تستخدم لإرسال أي الهدف-C كائن إلى C وظيفة.

كما في نموذج التعليمات البرمجية, هذا يمكن التلاعب بها مع العادي الهدف-C العمليات.

بالإضافة إلى ذلك يرجى قراءة هذه الإجابة: خلط ج وظائف في موضوعي C-class

نصائح أخرى

للاتصال الهدف-C رمز من ج رد وأود أن استخدام شيء من هذا القبيل:

void * refToSelf;
int cCallback()
{
    [refToSelf someMethod:someArg];
}

@implementation SomeClass
- (id) init
{
     self = [super init];
     refToSelf = self;
}
- (void) someMethod:(int) someArg
{
}

يمكن/كيف يمكنني الاتصال موضوعي-ج الأسلوب في مكان من هذا ؟

لا يمكنك.

يمكن/ينبغي أن تخلط ج وظيفة مع الهدف جيم الاتصال ؟

نعم.كتابة C وظيفة واستخدام ذلك رد إلى CF وظيفة.

كيف يمكنني خلط ج وظيفة مع الهدف-C الأساليب ؟

يمكنك تعيين self كما info المؤشر في سياق الهيكل.التي سيتم تمريرها إلى رد.ثم في رد ، يلقي info المؤشر مرة أخرى إلى id:

MyClass *self = (id)info;

يمكنك ثم إرسال self رسائل.كنت لا تزال لا يمكن الوصول مباشرة إلى المتغيرات سبيل المثال ، على الرغم من ، حيث ج هي وظيفة خارج @implementation القسم.عليك أن تجعل لهم خصائص.يمكنك أن تفعل هذا مع ملحق الفئة.(على عكس ما تقول الوثيقة ، فإنك لن تعلن تمديد داخل @implementation, ولكن في نفس الملف مع ذلك, عموما فوق ذلك.)

ما كنت دائما أجد من المفيد في هذه الحالة هو أن تجعل Obj-C المجمع على أعلى C API.تنفيذ ما تحتاج إلى استخدام وظائف C, وبناء موضوعي-الفئة C (أو اثنين) على أعلى من ذلك ، حيث أن كل ما في العالم الخارجي سوف نرى.على سبيل المثال ، في حالة وجود رد مثل هذا ، قد جعل ج وظيفة المكالمات Obj-C مندوب طرق على الكائنات الأخرى.

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