Ваше предположение верно; Objective-C (++) (в отличие от Java или Swift) переплетен с C ++, и вы можете смешивать код Objective-C с кодом C ++. Конечный файл .mm
на самом деле является подсказкой компилятору, что такое сочетание предназначено. Для Java и Swift вам нужен «мост», такой как JNI, для доступа к артефактам другого языка.
Как и в общем случае в Objective-C, любой вызов из основного потока (который является потоком пользовательского интерфейса) будет выполняться по умолчанию в основном потоке, если вы явно не отправите его в другой асинхронный поток. Так что явное runOnUiThread
излишне.