Расширение клавиатуры iOS прекращено с ограничением на процесс

Я пытаюсь разработать расширение клавиатуры для iOS 8. Помимо различных проблем, которые у меня были (из-за которых становится очевидным, что расширения — это просто запоздалая мысль), после начала тестирования на iPhone 6 я обнаружил, что расширение случайно завершается с записью в журнале сбоев, такой как эта:

 Name       |            <UUID>                |     CPU Time|     rpages|       purgeable| recent_max| lifetime_max| fds |  [reason]         | (state)
 MyKeyboard <93dea1cc8757387ba5e7da3006a7d23f>         0.638       13072                0           -          8483   50  [per-process-limit]  (frontmost)

Обратите внимание, что это происходит на iPhone 6 и iPhone 6 plus, но не происходит с менее мощным (с меньшим объемом оперативной памяти, но не 64-битным) iPhone 4S.

Конечно, этого не происходит, когда вы отлаживаете устройство.

Кроме того, этого не происходит, если я запускаю тот же код, что и приложение, а не расширение.

Завершения, кажется, происходят в основном, когда есть линии, нарисованные с помощью Quartz или, что еще проще, с атрибутивными строками, визуализируемыми как дуги, с использованием производного от Apple класса CoreTextArcCocoa. Профилировщик показывает, что ЦП никогда не загружается, использование ОЗУ в приложении составляет скромные 15-25 МБ. Существует много выделений/освобождений, когда я использую несколько из этих представлений текста дуги (в основном связанных со строками с атрибутами), поэтому я думаю, что, возможно, быстрые выделения (даже если за ними следуют освобождения) запускают какой-то процесс iOS, который завершает расширение из-за страха занимает слишком много оперативной памяти? Но как обойти это, если я не знаю точного триггера? И, конечно же, я не могу придумать способ отладки этой проблемы, так как она находится вне моего приложения. Я попытался открыть тикет с Apple по этому поводу, используя один из моих тикетов программы для разработчиков. Я попросил любую помощь, даже просто лучшее объяснение этого «предела для каждого процесса». Они закрыли и вернули его без ответа. Я снова открыл, спросив, по крайней мере, причину закрытия первого билета, они закрыли его и вернули деньги. Любые идеи о том, что именно происходит или что я мог бы попробовать?

Для справки, вот полная статистика памяти из того же крашлога:

Free pages:                              9054
Active pages:                            122754
Inactive pages:                          48617
Speculative pages:                       235
Throttled pages:                         0
Purgeable pages:                         4696
Wired pages:                             67788
File-backed pages:                       81292
Anonymous pages:                         90314
Compressions:                            15775
Decompressions:                          3940
Compressor Size:                         1364
Uncompressed Pages in Compressor:        4383
Page Size:                               16384
Largest process:   backboardd

person Ecuador    schedule 03.12.2014    source источник


Ответы (1)


Похоже, существует недокументированный лимит памяти для расширений клавиатуры. Это около 40Мб. Ваша клавиатура заняла rpages*4kb = 51Mb

person Dmitry Skorinko    schedule 15.12.2014
comment
Я вижу что-то подобное около 10 МБ для расширения поставщика файлов. Знаете ли вы о каких-либо других ограничениях для других типов расширений? - person Locksleyu; 05.02.2016