ios - create - Error de la aplicación en vivo en UIImage imageNamed:
uiimage frame swift 4 (4)
Tengo algunos problemas extraños con nuestra aplicación, se bloquea al usar algunos UIImage
. Obtengo la imagen con [UIImage imageNamed:@"imageName"]
del elemento de imagen. Pero en algún dispositivo devuelve nada que interrumpa mi aplicación, pero no debería ser nil
. Ya lo he comprobado y se está ejecutando en el hilo principal, queda suficiente memoria (aunque se estaba agotando).
La imagen es PDF como imagen de vector único en los activos de la imagen, esto debería crear los tamaños correctos de las imágenes.
¿Alguien puede darme algún consejo sobre cómo resolver este problema?
Thread : Crashed: com.apple.main-thread
0 CoreFoundation 0x1844d7108 CFDataGetBytePtr + 36
1 Foundation 0x18545a848 bytesInEncoding + 204
2 CoreFoundation 0x1844e88d4 -[__NSCFString UTF8String] + 80
3 CoreUI 0x18d6827c0 -[CUIStructuredThemeStore _canGetRenditionWithKey:isFPO:lookForSubstitutions:] + 780
4 CoreUI 0x18d6a5614 -[CUICatalog _resolvedRenditionKeyFromThemeRef:withBaseKey:scaleFactor:deviceIdiom:deviceSubtype:sizeClassHorizontal:sizeClassVertical:memoryClass:graphicsClass:graphicsFallBackOrder:] + 1484
5 CoreUI 0x18d6a4784 -[CUICatalog namedLookupWithName:scaleFactor:deviceIdiom:deviceSubtype:sizeClassHorizontal:sizeClassVertical:] + 148
6 UIKit 0x18a3df338 __98-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:]_block_invoke + 424
7 UIKit 0x18a3df0d8 -[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:] + 212
8 UIKit 0x18a4f1698 -[UIImageAsset imageWithTraitCollection:] + 404
9 UIKit 0x18a3df7c0 -[_UIAssetManager imageNamed:withTrait:] + 276
10 UIKit 0x189e7277c +[UIImage imageNamed:inBundle:compatibleWithTraitCollection:] + 220
11 UIKit 0x189ccb47c +[UIImage imageNamed:] + 124
12 Speakap 0x1000bef50 -[LoadingView commonInit] (LoadingView.m:74)
13 Speakap 0x1000beabc -[LoadingView initWithFrame:] (LoadingView.m:28)
14 Speakap 0x1001348dc -[BaseTableViewController viewDidLoad] (BaseTableViewController.m:32)
15 Speakap 0x1001570d4 -[BaseMessageViewController viewDidLoad] (BaseMessageViewController.m:66)
16 Speakap 0x10014aa34 -[MessageViewController viewDidLoad] (MessageViewController.m:37)
17 UIKit 0x189b8c098 -[UIViewController loadViewIfRequired] + 996
18 UIKit 0x189ba4350 -[UIViewController __viewWillAppear:] + 132
19 UIKit 0x189d3dfb4 -[UINavigationController _startCustomTransition:] + 1052
20 UIKit 0x189c4a190 -[UINavigationController _startDeferredTransitionIfNeeded:] + 688
21 UIKit 0x189c49e6c -[UINavigationController __viewWillLayoutSubviews] + 60
22 UIKit 0x189c49dd4 -[UILayoutContainerView layoutSubviews] + 208
23 UIKit 0x189b877ac -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 644
24 QuartzCore 0x189386b58 -[CALayer layoutSublayers] + 148
25 QuartzCore 0x189381764 CA::Layer::layout_if_needed(CA::Transaction*) + 292
26 QuartzCore 0x189381624 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32
27 QuartzCore 0x189380cc0 CA::Context::commit_transaction(CA::Transaction*) + 252
28 QuartzCore 0x189380a08 CA::Transaction::commit() + 512
29 UIKit 0x189b7d9d8 _afterCACommitHandler + 180
30 CoreFoundation 0x1845afbd0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
31 CoreFoundation 0x1845ad974 __CFRunLoopDoObservers + 372
32 CoreFoundation 0x1845adda4 __CFRunLoopRun + 928
33 CoreFoundation 0x1844dcca0 CFRunLoopRunSpecific + 384
34 GraphicsServices 0x18f718088 GSEventRunModal + 180
35 UIKit 0x189bf4ffc UIApplicationMain + 204
36 Speakap 0x100162b24 main (main.m:14)
37 libdyld.dylib 0x19990a8b8 start + 4
He experimentado algunos "problemas" en la administración de la memoria utilizando [UIImage imageNamed:@""]
dentro del contexto de memoria baja.
Como dice la documentación: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/occ/clm/UIImage/imageNamed :
Discusión
Este método busca en el caché del sistema un objeto de imagen con el nombre especificado y lo devuelve si existe. Si un objeto de imagen coincidente no está ya en la memoria caché , este método localiza y carga los datos de imagen del disco o catálogo de activos, y luego devuelve el objeto resultante. En iOS 9 y posterior, este método es seguro para subprocesos .
No sé en qué sistema operativo ocurre el bloqueo, pero puede ser una idea.
Otro punto, ¿todavía sucede si reemplazas imageNamed:
por imageWithContentOfFile:
o initWithContentOfFile:
:?
La administración de la memoria es diferente (sin caché del sistema): https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/occ/instm/UIImage/initWithContentsOfFile :
Discusión
Este método carga los datos de imagen en la memoria y los marca como purgables. Si los datos se purgan y deben volver a cargarse, el objeto de imagen vuelve a cargar esos datos desde la ruta especificada.
https://github.com/rickytan/RTImageAssets
instale el complemento anterior en xcode y vaya a file -> imageAssets -> Generate Missing assets.i generará todas las imágenes faltantes.
La única posibilidad que puedo ver aquí, es que un dispositivo específico podría no tener el archivo adecuado. Por ejemplo, si el dispositivo tiene una pantalla Retina y no hay una imagen @ 2x en el elemento de la imagen, se devolverá como nulo, etc.
Mi sugerencia es asegurarme de que todos los tamaños requeridos estén realmente dentro del activo de la imagen + asegúrese de usar el nombre del grupo de activos para el parámetro imageNamed :.
Además, ¿lo estás probando en varios simuladores o dispositivos reales?
Es posible que esté utilizando una imagen de alta resolución y compruebe iPhone 4 / 4s o viceversa. Agregue todos los tamaños de imágenes en activos de imagen y luego verifique la imagen, ya sea que devuelva nulo o no. No es necesario mencionar @ 2x, @ 3x si estamos utilizando activos de imagen, tomará automáticamente el tamaño adecuado de los activos de imagen.