2012-06-21 4 views
6

Sto costruendo un'applicazione di gestione dei file, e io di tanto in tanto il seguente errore durante la chiamata di un UIImagePickerController o un MPMediaPickerController:iOS UIAppearance errore

*** -[_UIImageViewPretiledImageCacheKey hash]: message sent to deallocated instance 0x140dc0 

Recentemente ho dato la mia applicazione di un tema personalizzato utilizzando iOS 5 di UIAppearance API e questo è quando ho iniziato a ricevere questo errore. Con indovinare e controllo, ho trovato le linee problematiche del mio codice che causare questo errore:

UIImage *backButtonImage = [[UIImage imageNamed:@"backButton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(12, 16, 12, 8)]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
UIImage *barButtonImage = [[UIImage imageNamed:@"barButton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(14, 12, 14, 12)]; 
[[UIBarButtonItem appearance] setBackgroundImage:barButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

Non ho idea di come questo codice attiva l'errore di cui sopra. Puoi spiegarmi la fonte di questo errore e fornire una soluzione per risolverlo.

Grazie in anticipo per il vostro aiuto, Guvvy

+2

Per chi ha la sfortuna di essere visto questo incidente, ecco un'altra risorsa molto utile: http://openradar.appspot.com/11411000 – jpm

+0

sappiamo perché questo accade ancora? Sto ottenendo la stessa cosa in iOS 6. Sto personalizzando le mie immagini 20x20 e ho un margine di 9 su tutti i lati ... – bogardon

+0

@bogardon stai facendo questo crash su dispositivi non retina? – Gavy

risposta

3

Dopo qualche test più approfondito, sono giunto alla conclusione che questo problema è limitato ai dispositivi retina. Il problema si è verificato nelle immagini @ 2x. Avevano una risoluzione numerica dispari (ad esempio 59px per 60px). Tutto ciò che ho fatto è stato ricreare l'immagine e cambiato la risoluzione a 60px per 60px e non ho mai più avuto il problema.

Sono stato un po 'sorpreso dalla soluzione perché non ho visto alcuna correlazione tra il messaggio di errore e la riga di codice, ma alla fine, sono state le immagini a causare questo problema.

+0

Le mie immagini @ 2x non hanno una risoluzione numerica dispari ma questo incidente si verifica ancora occasionalmente ... – Qusic

2

Ho avuto un similar problem, ma il mio arresto anomalo è stato causato da un'immagine ridimensionabile in un UIImageView.

La mia immagine ridimensionabile ha margini in alto = 30 px, sinistra = 20 px, in basso = 1 px, destra = 10 px. L'immagine è 43x45, quindi la sua area ridimensionabile è 13x14. Sto usando iOS6, quindi sono stato in grado di risolvere il problema specificando UIImageResizingModeStretch come resizingMode per -[UIImage resizableImageWithCapInsets:resizingMode:].

Works:

UIImage *image = [UIImage imageNamed:name]; 
UIImage *resizableImage = [image resizableImageWithCapInsets:edgeInsets resizingMode:UIImageResizingModeStretch]; 

crash con EXC_BAD_ACCESS o [_UIImageViewPretiledImageCacheKey hash]: message sent to deallocated instance 0xb14deb0 con NSZombieEnabled:

UIImage *image = [UIImage imageNamed:name]; 
UIImage *resizableImage = [image resizableImageWithCapInsets:edgeInsets]; 
0

ho ottenuto lo stesso per il seguente codice

UIImage* image = [UIImage stretchableImageNamed:@"imageName"]; 
self.backgroundView = [[UIImageView alloc] initWithImage:image]; 
self.selectedBackgroundView = [[UIImageView alloc] initWithImage:image]; 

dove self è UITableViewCell e stretchableImageNamed: è semplicemente

+(UIImage*)stretchableImageNamed:(NSString*)name 
{ 
    UIImage *img = [UIImage imageNamed:name]; 
    CGSize sz = img.size; 
    int left = (sz.width - 1.)/2.; 
    int top = (sz.height - 1.)/2.; 
    return [img resizableImageWithCapInsets:UIEdgeInsetsMake(top, left, top, left)]; 
} 

questo ha aiutato:

self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage stretchableImageNamed:@"imageName"]]; 
self.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage stretchableImageNamed:@"imageName"]];