Вызов CIContext.Сбой FromOptions в iOS

#xamarin.ios

#xamarin.ios

Вопрос:

В моем приложении Xamarin для iOS я постоянно получаю экземпляры CIImage, которые мне нужно преобразовать в экземпляр CGImage. Вот соответствующий код:

 CIContext cicontext = CIContext.FromOptions(null);
CGImage cgimage = cicontext.CreateCGImage(ciimage, ciimage.Extent);
...
cgimage.Dispose();
cicontext.Dispose();
 

Все работает нормально для первых 100 или около того вызовов. После этого я получаю сбой в приложении. Вот трассировка стека:

 critical:   2   libsystem_platform.dylib            0x21866077 _sigtramp   42
critical:   3   CoreImage                           0x24a352b9 <redacted>   64
critical:   4   CoreImage                           0x24a6c005 <redacted>   292
critical:   5   CoreImage                           0x24a6c237 <redacted>   18
critical:   6   CoreImage                           0x24a4b431 <redacted>   512
critical:   7   CoreImage                           0x24a47d5b <redacted>   734
critical:   8   CoreImage                           0x24a47a55 <redacted>   52
critical:   9   MyApp                               0x00fa4eb4 wrapper_managed_to_native_ObjCRuntime_Messaging_IntPtr_objc_msgSend_IntPtr_intptr_intptr_intptr   108
critical:   10  MyApp                               0x00f41a5c CoreImage_CIContext_FromOptions_Foundation_NSDictionary   120
critical:   11  MyApp                               0x00f41868 CoreImage_CIContext_FromOptions_CoreImage_CIContextOptions   48
 

По сути, некоторая логика в CIContext.FromOptions приводит к сбою.

На данный момент я сделал объект cicontext статической переменной, которая инициализируется только один раз. Похоже, это устраняет сбой. Тем не менее, я был бы признателен, если у вас есть какое-либо представление. С уважением.

Ответ №1:

Для тех, кто столкнулся с этой проблемой, это исправление сработало для нас:

  1. Вызовите cicontext = CIContext.FromOptions(null) только один раз и удерживайте возвращаемое значение либо как переменную-член, либо как статическую переменную.
  2. После звонка CreateCGImage звоните cicontext.ClearCaches() . Если этого не сделать, у вас в конечном итоге закончится память.

Надеюсь, это поможет. С уважением.