2012-06-21 12 views
6

Buduję aplikację do zarządzania plikami, a ja od czasu do czasu pojawia się następujący błąd podczas wywoływania UIImagePickerController lub MPMediaPickerController:iOS UIAppearance Błąd

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

Niedawno dał mój app motywu niestandardowego przy użyciu iOS 5 za UIAppearance API i to kiedy zacząłem dostawać ten błąd. Poprzez zgadywanie i sprawdzanie, znalazłem problematyczne wiersze mojego kodu, który powoduje ten błąd:

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

nie mam pojęcia, jak ten kod wyzwala powyższy błąd. Czy możesz wyjaśnić mi źródło tego błędu i podać rozwiązanie, aby go naprawić.

Z góry dzięki za pomoc, Guvvy

+2

Dla tych pecha widzieć tę katastrofę, oto kolejny bardzo przydatne źródło: http://openradar.appspot.com/11411000 – jpm

+0

wiemy dlaczego tak się dzieje? Robię to samo w iOS 6. Mam niestandardowe rysowanie moich własnych obrazów 20x20 i mają wstawki z wstawkami po 9 z każdej strony ... – bogardon

+0

@bogardon Czy dostaniesz tę awarię na urządzeniach nie-siatkówkowych? – Gavy

Odpowiedz

3

Po jakimś bardziej dokładnego badania, doszedłem do wniosku, że ten problem jest ograniczony do urządzeń z wyświetlaczem Retina. Problem okazał się na obrazach 2x. Miały rozdzielczość nieparzystą (np. 59 na 60 pikseli). Wszystko, co zrobiłem, to odtworzyć obraz i zmienić rozdzielczość na 60px na 60px i nigdy więcej nie doświadczyłem problemu.

Byłem trochę zaskoczony przez rozwiązanie, ponieważ nie widziałem korelacji między komunikatem o błędzie a linią kodu, ale w końcu to obrazy spowodowały ten problem.

+0

Obrazy My @ 2x nie mają nieparzystej rozdzielczości, ale ta awaria zdarza się sporadycznie ... – Qusic

2

Posiadałem similar problem, ale moja awaria została spowodowana przez zmianę rozmiaru obrazu w UIImageView.

Mój obraz z możliwością zmiany rozmiaru ma krawędzie wypukłe z góry = 30 pikseli, lewe = 20 pikseli, dolne = 1 piksel, prawo = 10 pikseli. Obraz ma rozmiar 43 x 45 pikseli, więc jego rozmiar jest 13 x 14. Używam iOS6, więc udało mi się obejść problem, podając UIImageResizingModeStretch jako resizingMode dla .

Works:

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

wywala się z EXC_BAD_ACCESS lub [_UIImageViewPretiledImageCacheKey hash]: message sent to deallocated instance 0xb14deb0 z NSZombieEnabled:

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

mam takie same dla następującego kodu

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

gdzie self jest UITableViewCell i stretchableImageNamed: jest po prostu

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

to pomogło:

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