Я хотел бы разоблачить обработчики уведомлений ObjC для моего кода клиента C++. Я делаю это так.
Теперь проблема в том, что исходные структуры ObjC аргументов являются сложными, содержащими несколько слоев объектов ObjC, которые необходимо перевести.
На моей стороне оберточный наблюдатель F не должен делать ничего особенного, просто называя клиентский FF.
Какова более правильная стратегия моего перевода на данный момент?
Нужно ли мне:
Мои целевые пользователи - разработчики iOS, которые могут или не могут быть разработчиками Android.
Вы можете смешать c++ и объект c++ в файле реализации.mm. Это означает, что вы можете присвоить c++ лямбда (или блок) объекту c++, который ссылается на владельца c++.
что-то вроде этого:
implementation.mm:
@interface Shim : NSObject
{
std::function<void>() _notify;
}
@end
@implementation Shim
- void register_cpp(std::function<void>() f)
{
_notify = std::move(f);
}
- (void) my_handler()
{
if(_notify)
_notify();
}
@end
struct cpp_class::impl {
impl()
: _shim([Shim alloc[init]])
{
_shim.register_cpp(std::bind(&impl::callback, this));
}
private:
void callback() {
// do callback here;
}
Shim* _shim;
};
cpp_class::cpp_class()
: _impl(new impl)
{
}
cpp_class::~cpp_class()
{
delete _impl;
}
header.h:
struct cpp_class{
cpp_class();
~cpp_class();
private:
struct impl;
impl* _impl;
};
На самом деле вам нужно быть осторожным, чтобы объекты все еще существовали при выполнении обратных вызовов (аргументы в пользу weak_ptr :: lock(), enable_shared_from_this и т.д.), Поскольку object-c любит помещать обратные вызовы в цикл выполнения потока (в основном очередь), и это означает, что ваш объект c++ может уйти до того, как поступит обратный вызов, но этот код должен дать вам правильную идею.