2015-12-01 10 views
16

Ho alcuni problemi strani con la nostra app, si blocca quando si utilizzano alcuni UIImage. Ottengo l'immagine con [UIImage imageNamed:@"imageName"] dalla risorsa immagine. Ma su alcuni dispositivi restituisce nil che causa l'arresto anomalo della mia app, ma non dovrebbe essere nil. Ho già controllato ed è in esecuzione sul thread principale, rimane abbastanza memoria (anche se stava per esaurirsi).Arresto anomalo dell'app in diretta su UIImage imageNamato:

L'immagine è PDF come immagine vettoriale singola nelle risorse immagine, questo dovrebbe creare le dimensioni corrette delle immagini.

Qualcuno può darmi qualche suggerimento su come risolvere questo 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 
+0

Hai provato ad aggiungere l'estensione della tua immagine. "imageName.png" per esempio? Senza @ 2x/@ 3x – ejanowski

+4

@ejanowski sono abbastanza sicuro che non è mai necessario, anche quando non si utilizza images.xcassets. – Kevin

+1

@Kevin infatti, non è necessario SE l'immagine è di tipo png. Se è jpg, devi specificare l'estensione. – ejanowski

risposta

0

L'unica possibilità che posso vedere qui è che un dispositivo specifico potrebbe non avere il file corretto. Ad esempio, se il dispositivo ha un display Retina e non vi è un'immagine @ 2x nell'asset immagine, verrà restituito come zero ecc.

Il mio suggerimento è di assicurarsi che tutte le dimensioni richieste siano effettivamente presenti all'interno della risorsa immagine + assicurati di utilizzare il nome gruppo di attività per il parametro imageNamed :.

Inoltre, lo stai testando su vari simulatori o dispositivi reali?

+1

L'ho provato sul dispositivo su cui è andato in crash. Non si arresta sempre.Non riesco nemmeno a riprodurlo sul dispositivo, a volte si blocca. – rckoenes

1

https://github.com/rickytan/RTImageAssets

installare sopra plugin per Xcode e andare su File -> ImageAssets -> Genera mancante assets.i genererà tutte le immagini mancanti.

enter image description here

+2

plug-in perfetto per generare asset mancanti. Grazie a @Janak LN –

+1

Poiché utilizzo i file PDF per le risorse non ci sono risorse mancanti. C'è una risorsa per immagine e su build tutte le dimensioni delle immagini richieste sono create dalla risorsa immagine. – rckoenes

3

ho sperimentato alcuni "problemi" nella gestione della memoria utilizzando [UIImage imageNamed:@""] nel contesto di memoria insufficiente.

Come la documentazione dice: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/occ/clm/UIImage/imageNamed:

Discussione

Questo metodo appare nelle cache di sistema per un oggetto immagine con il nome e ritorna quell'oggetto se esiste specificato. Se un oggetto immagine corrispondente non è già nella cache, questo metodo individua e carica i dati dell'immagine dal disco o dal catalogo delle risorse e quindi restituisce l'oggetto risultante. In iOS 9 e versioni successive, questo metodo è thread-safe.

Non so su quale sistema operativo si verifichi l'arresto anomalo, ma può essere un'idea.

Altro punto, succede ancora se si sostituisce imageNamed: per imageWithContentOfFile: o initWithContentOfFile:?

La gestione della memoria è differente (senza cache di sistema): https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/occ/instm/UIImage/initWithContentsOfFile:

Discussione

Questo metodo carica i dati di immagine in memoria e contrassegna come eliminabile. Se i dati vengono eliminati e devono essere ricaricati, l'oggetto immagine carica nuovamente tali dati dal percorso specificato.

+0

Su iOS 8 e 9. – rckoenes

0

È possibile che si stia utilizzando la risoluzione dell'immagine & ad alta risoluzione su iPhone 4/4s o vice-versa. Aggiungi tutte le dimensioni delle immagini nelle risorse immagine & quindi controlla l'immagine, se restituisce o meno. Non c'è bisogno di menzionare @ 2x, @ 3x se stiamo usando risorse immagine, prenderà automaticamente le dimensioni appropriate dalle risorse immagine.

+0

Sto usando un singolo vettore, quindi non '@ 2x' o' @ 3x'. Inoltre sembra accadere anche su iPhone 6. – rckoenes

+0

Se si utilizzano le immagini separatamente, non si utilizza image.xcassets, quindi è possibile accedere all'immagine direttamente da

+0

Lo so, sono sicuro che asserire catelog con immagini vettoriali! Quindi ci sono file PNG e PNG e nessuna dimensione con '@ 2x' o' @ 3x'. – rckoenes