2012-06-21 4 views
6

Ich baue eine Datei-Management-Anwendung, und ich gelegentlich die folgende Fehlermeldung erhalten, während ein UIImagePickerController oder ein MPMediaPickerController Aufruf:iOS UIAppearance Fehler

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

ich meine App vor kurzem ein eigenes Thema gab iOS 5 die UIAppearance API und das ist, als ich begann, diesen Fehler zu bekommen. Durch erraten und Überprüfung, fand ich die problematischen Zeilen meines Codes, die diesen Fehler verursachen:

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]; 

Ich habe keine Ahnung, wie dieser Code den obigen Fehler auslöst. Können Sie mir bitte die Ursache dieses Fehlers erklären und eine Lösung zur Behebung des Fehlers bereitstellen?

Vielen Dank im Voraus für Ihre Hilfe, Guvvy

+2

Für das Pech, die diesen Absturz zu sehen, hier ist ein andere sehr nützliche Ressource: http://openradar.appspot.com/11411000 – jpm

+0

können wir wissen, Warum passiert das schon? Ich bekomme die gleiche Sache in iOS 6. Ich zeichne meine eigenen 20x20 Bilder und habe 9 universelle Kappeneinsätze auf allen Seiten ... – bogardon

+0

@bogardon bekommen Sie diesen Absturz auf Nicht-Retina-Geräten? – Gavy

Antwort

3

Nach einiger gründlichen Prüfung habe ich zu dem Schluss gekommen, dass dieses Problem auf Retina-Geräte beschränkt ist. Das Problem stellte sich in den @ 2x Bildern. Sie hatten eine ungerade nummerierte Auflösung (zB 59px um 60px). Alles was ich gemacht habe, war das Bild neu zu erstellen und die Auflösung auf 60px um 60px zu ändern und ich habe das Problem nie wieder erlebt.

Ich war irgendwie überrascht von der Lösung, da ich keine Korrelation zwischen der Fehlermeldung und der Codezeile sah, aber am Ende waren es die Bilder, die dieses Problem verursachten.

+0

Meine @ 2x Bilder haben keine ungerade Auflösung, aber dieser Absturz tritt gelegentlich auf ... – Qusic

2

Ich hatte eine similar problem, aber mein Absturz wurde durch ein veränderbares Bild in einer UIImageView verursacht.

Mein Bild in der Größe hat Randeinfügungen von oben = 30px, links = 20px, unten = 1px, rechts = 10px. Das Bild hat eine Größe von 43x45 und ist daher in der Größe 13x14 veränderbar. Ich verwende iOS6, daher konnte ich das Problem umgehen, indem ich UIImageResizingModeStretch als resizingMode für -[UIImage resizableImageWithCapInsets:resizingMode:] festlegte.

Works:

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

Crashes mit EXC_BAD_ACCESS oder [_UIImageViewPretiledImageCacheKey hash]: message sent to deallocated instance 0xb14deb0 mit NSZombieEnabled:

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

bekam ich das gleiche für den folgenden Code

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

wo self ist UITableViewCell und stretchableImageNamed: ist einfach

+(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)]; 
} 

dies hilft:

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