6

我正在构建一个文件管理应用程序,在调用 aUIImagePickerController或 a时偶尔会收到以下错误MPMediaPickerController

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

我最近使用 iOS 5 的 UIAppearance API 为我的应用程序提供了一个自定义主题,这就是我开始收到此错误的时候。通过猜测和检查,我发现了导致此错误的代码有问题的行:

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

我不知道这段代码是如何触发上述错误的。您能否向我解释此错误的根源并提供解决方案来解决它。

提前感谢您的帮助,古维

4

3 回答 3

3

经过一些更彻底的测试,我得出结论,这个问题仅限于视网膜设备。问题出在@2x 图像中。它们的分辨率为奇数(例如 59 像素 x 60 像素)。我所做的只是重新创建图像并将分辨率更改为 60 x 60 像素,我再也没有遇到过这个问题。

我对这个解决方案感到有点惊讶,因为我发现错误消息和代码行之间没有相关性,但最终,是图像导致了这个问题。

于 2012-06-21T03:46:47.853 回答
2

我有一个类似的问题,但我的崩溃是由UIImageView.

我的可调整大小的图像具有顶部 = 30 像素、左侧 = 20 像素、底部 = 1 像素、右侧 = 10 像素的边缘插图。图像为 43x45,因此其可调整大小的区域为 13x14。我正在使用 iOS6,因此我能够通过指定UIImageResizingModeStretchresizingModefor来解决该问题-[UIImage resizableImageWithCapInsets:resizingMode:]

作品:

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

EXC_BAD_ACCESS与或[_UIImageViewPretiledImageCacheKey hash]: message sent to deallocated instance 0xb14deb0一起崩溃NSZombieEnabled

UIImage *image = [UIImage imageNamed:name];
UIImage *resizableImage = [image resizableImageWithCapInsets:edgeInsets];
于 2013-01-11T04:51:55.873 回答
0

对于以下代码,我得到了相同的结果

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

在哪里和self只是UITableViewCellstretchableImageNamed:

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

这有助于:

self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage stretchableImageNamed:@"imageName"]];
self.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage stretchableImageNamed:@"imageName"]];
于 2013-02-21T10:39:45.163 回答