Согласно этому ответу StackOverflow , вы можете передать свой объект Objective-C методу C.Хотя этот ответ конкретно касается передачи экземпляра класса и вызова метода экземпляра вместо статического, попробуйте это, как в моей голове, он должен работать, если я не пропустил что-то явно очевидное.
Я знаю, что вы сказали, что это не идеально, так как ваша библиотека будет вызывать функцию C, но, возможно, есть другой способ передать это?
Определите метод C с параметром id следующим образом:
void cFunction(id param)
Затем вызовите его (что-то) так:
Class thisClass = [self getClass];
cFunction(self);
Изменитьприведенный выше код в соответствии с этим
//Objective-C class
@interface ActionNotifier : NSObject
+(void)printMessage;
@end
@implementation ActionNotifier
+(void)printMessage {
NSLog(@"Received message from C code");
}
@end
//C class:
#import "ActionNotifier.h"
#import <Cocoa/Cocoa.h>
void cFunction(id param)
{
[param printSecurityMessage];
}
Если это неприемлемо
Вы можете использовать NSNotificationCenter
в Core Foundation согласно This StackOverflowpost , хотя если вам нужно [ActionNotifier printMessage]
, чтобы быть статичным, вам нужно подключить [NSNotificationCenter addObserver]
где-нибудь еще.
//NSNotificationCenter Wire-up
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(method), @"MyNotification", nil];
-(id)method{
[ActionNotifier printMessage];
}
//Objective-C class
@interface ActionNotifier : NSObject
+(void)printMessage;
@end
@implementation ActionNotifier
+(void)printMessage {
NSLog(@"Received message from C code");
}
@end
//C source: //may need to rename to .mm if you cannot see the core foundation
#include <CoreFoundation/CoreFoundation.h>
void cFunction()
{
CFNotificationCenterRef center = CFNotificationCenterGetLocalCenter();
CFNotificationCenterPostNotification(center, CFSTR("MyNotification"), NULL, NULL, TRUE);
}