передача указателей или целочисленных типов через executeSelector - PullRequest
3 голосов
/ 10 ноября 2009

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

Мой текущий подход заключается в передаче указателей на функции для экземпляра target-c (полученного из NSObject) и выполнения на нем performSelector / performSelectorOnMainThread.
Но performSelector ожидают объекты в качестве своих аргументов, так как обычно это обернуть?

Пример:

 typedef void(*FnPtr)(void*);
 FnPtr fn;
 [someInstance performSelector:@selector(test:) withObject:fn];

... где тест объявляется как:

- (void)test:(FnPtr)fn;

Должен добавить, что я только начал с объектива-c на этой неделе, поэтому, если есть лучший способ, я также был бы рад услышать об этом.
Также обратите внимание, что у меня нет никакого доступа к основному циклу или любым объектам приложения, потому что проект является плагином браузера (в настоящее время только Mac ориентирован на Safari).

Ответы [ 2 ]

5 голосов
/ 12 ноября 2009

Как ответил smorgan здесь , NSValue разработан как контейнер для скалярных типов C и Objective-C:

- (void)test:(NSValue*)nv
{
    FnPtr fn = [nv pointerValue];
    // ...
}

// usage:
NSValue* nv = [NSValue valueWithPointer:fn];
[someInstance performSelector:@selector(test:) withObject:nv];
0 голосов
/ 14 ноября 2009

Я не уверен, считается ли мое решение вменяемым / правильным - однако я часто передаю указатели, просто вводя их тип (id). Это грязно, но работает на меня. Возможно, более чистый способ - использовать NSValue.

...