Я хочу минимизировать количество кода Obj-C в моем проекте.
В рамках этих усилий становится необходимым абстрагировать данные мультитач UITouch, создать экземпляры некоторых классов C ++, которые будут удерживать данные, пока я работаю с ними из C ++, вместо того, чтобы работать с ними напрямую через цель C. Есть много причин для этого. это так (например, возможность подключиться к коду, используя любую произвольную форму ввода устройства).
Вот API, который я получил до сих пор. у меня есть InputHandler
класс, который имеет эти публичные методы:
// c++
void beginPoint(float x, float y, void* touchUID);
void endPoint(float x, float y, void* touchUID);
void movePoint(float x, float y, void* touchUID);
void cancelPoint(float x, float y, void* touchUID);
которые соответствуют - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
и так далее в моем ViewController.mm
,
Мне нужно отслеживать отдельные пальцы по отдельности, и документация ясно дает понять, что каждому пальцу назначается свой собственный экземпляр UITouch (то есть объект UITouch фактически представляет определенный палец). Это указывает на то, что я могу избежать использования значения указателя в качестве уникального идентификатора для точки отслеживания пальцев.
Тем не менее, я столкнулся с проблемой здесь:
Мне нужно узнать о мостовых бросках сейчас. Честно говоря, я ничего не знаю о том, как работает ARC, потому что я пока плохо понимаю, что такое сохранение / освобождение. Я полностью вложен в shared_ptr
и друзья из C ++, чтобы помочь мне управлять сложными системами.
Мне явно нужно просто Оставь UITouch* touch
в одиночестве, и пусть это будет сохранено / release / ARC’d точно так, как будто я не получил к нему доступ. Но даже для чего-то столь же простого, как это, не ясно, какой из трех вариантов связывания я должен использовать.
Если вы согласны с тем, что объект UITouch исчезает после возвращения метода, все, что вам нужно, — это простое приведение __bridge. Вы можете использовать адрес памяти объекта UITouch как ключ до тех пор, пока ты не разыграешь его. Это будет зависать вскоре после возврата метода.
Других решений пока нет …