خلط ج وظائف في موضوعي C-class
-
03-07-2019 - |
سؤال
أنا أكتب موضوعي C-class ولكنه يستخدم API مكتوب في C.هذا هو الغالب بخير خلط ج المكالمات مع الهدف جيم المكالمات يسبب بعض المشاكل.
ومع ذلك واحدة من استدعاء API يتطلب الإتصال الطريقة (على سبيل المثال):
success = CFHostSetClient(host, MyCFHostClientCallBack, &context);
حيث MyCFHostClientCallBack
هو C وظيفة محددة مثل هذا:
static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);
- يمكن/كيف يمكنني الاتصال موضوعي-ج الأسلوب في مكان من هذا ؟
- يمكن/ينبغي أن تخلط C الوظائف مع الهدف جيم المكالمات ؟
- كيف يمكنني خلط C الوظائف مع الهدف-C الأساليب ؟
المحلول
خلط C و الهدف-C أساليب وظيفة ممكن هنا مثال بسيط يستخدم سكليتي API داخل التطبيق فون:(بالطبع الموقع)
ج وظائف تحتاج إلى أن أعلن خارج @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 مندوب طرق على الكائنات الأخرى.