iOS, как вызвать статический метод Objective-C из функции C? - PullRequest
3 голосов
/ 03 мая 2019

Я работаю с устаревшей библиотекой, которая позволяет мне вызывать функцию C в ответ на какое-то событие.

Я не могу передать параметры в функцию C.Я хочу, чтобы функция C возводила событие в код Objective-C.

Я не могу найти четкого примера, и примеры, которые я вижу, передают параметр по id в функцию C.Я не могу передать параметры в своем коде (библиотека будет вызывать функцию C)

Как я могу вызвать статический / классовый метод Objective-C из функции C?

//Objective-C class
@interface ActionNotifier : NSObject

+(void)printMessage;

@end

@implementation ActionNotifier

+(void)printMessage {
    NSLog(@"Received message from C code");
}

@end

//response.c source file:
#import "ActionNotifier.h"
#import <Cocoa/Cocoa.h>

void cFunction()
{
    //How can I get the equivalent of this to be called from here?
    [ActionNotifier printMessage]; //error: Expected expression
}

1 Ответ

3 голосов
/ 03 мая 2019

Согласно этому ответу 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);
}
...