我知道在StackOverflow这里有很多关于这个话题的问题,我希望尝试了很多提示和答案。但在这种简单而简单的情况下,没有任何帮助。
--
在基于ARC的应用程序中,我使用了来自Ray的一个名为UIView的SpeechBubbleView子类。它对UIView进行了子类化,并绘制了一个包含文本的语音气泡,如短信应用程序中的文本。
它使用两个UIImage实例。在“查看所绘制的气泡”的绘图方法中。
在iPhone模拟器里,一切都很好。但是,在运行 7.1的iPhone 5上,每当绘制第二个图像时,总会出现EXC_BAD_ACCESS异常,而不管第一个图像是否被绘制。
我会提供一些守则:
@property (nonatomic, retain) UIImage* lefthandImage;
@property (nonatomic, retain) UIImage* righthandImage;在initWithFrame-方法中,从支持的文件文件夹加载的两个图像:
self.lefthandImage = [[UIImage imageNamed:@"BubbleLefthand"]
stretchableImageWithLeftCapWidth:20 topCapHeight:19];
self.righthandImage = [[UIImage imageNamed:@"BubbleRighthand"]
stretchableImageWithLeftCapWidth:20 topCapHeight:19];在SpeechBubbleView的drawRect方法中,图像绘制如下:
- (void)drawRect:(CGRect)rect
{
[self.backgroundColor setFill];
UIRectFill(rect);
CGRect bubbleRect = CGRectInset(self.bounds, VertPadding, HorzPadding);
CGRect textRect;
textRect.origin.y = bubbleRect.origin.y + TextTopMargin;
textRect.size.width = bubbleRect.size.width - TextLeftMargin - TextRightMargin;
textRect.size.height = bubbleRect.size.height - TextTopMargin - TextBottomMargin;
if (_bubbleType == BubbleTypeLefthand)
{
[self.lefthandImage drawInRect:bubbleRect];
textRect.origin.x = bubbleRect.origin.x + TextLeftMargin;
}
else
{
[self.righthandImage drawInRect:bubbleRect];
textRect.origin.x = bubbleRect.origin.x + TextRightMargin;
}
[[UIColor blackColor] set];
NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
textStyle.lineBreakMode = NSLineBreakByWordWrapping;
textStyle.alignment = NSTextAlignmentLeft;
[_text drawInRect:textRect withAttributes:@{NSFontAttributeName:font, NSParagraphStyleAttributeName:textStyle}];
}在代码行中,"RightHandImage“将被绘制,每次抛出BAD_ACCESS-异常时。如果我把这一行注释掉,一切都很好。左撇子泡沫将被完美地描绘成一个“泡沫”。
另外,如果我注释掉绘制第一个图像(左侧气泡)的线,第二个图像将抛出这个异常。
即使现在已经实现了多线程,我仍然尝试在@synthesize(...){...}中封装绘图方法,在StackOverflow这里给出了一些类似问题的提示,但是它不是解决方案,每次都会抛出异常。
我知道,没有其他类保存此映像的实例来输入访问权限问题。
有人能给我一些提示吗?谢谢!
编辑:UITableViewCell-提示和创建真正的,自己的图像拷贝
也许知道SpeechBubbleView的每个实例都是在重用的UITableViewCell中绘制的,这是很好的。因此,我不再使用UIImage:imageNamed返回的UIImage-实例,而是使用以下代码创建每个实例的真正副本:
UIImage* tmpImage = [UIImage imageNamed:@"BubbleLefthand"];
self.lefthandImage = [[UIImage imageWithCGImage:[tmpImage CGImage] ]
stretchableImageWithLeftCapWidth:20 topCapHeight:19];
tmpImage = [UIImage imageNamed:@"BubbleRighthand"];
self.righthandImage = [[UIImage imageWithCGImage:[tmpImage CGImage] ]
stretchableImageWithLeftCapWidth:20 topCapHeight:19];对于Putz1103的建议,我在抽签方法周围添加了零守卫:
if (_bubbleType == BubbleTypeLefthand)
{
if(self.lefthandImage != nil) {
[self.lefthandImage drawInRect:bubbleRect];
}
textRect.origin.x = bubbleRect.origin.x + TextLeftMargin;
}
else
{
if(self.righthandImage != nil) {
[self.righthandImage drawInRect:bubbleRect];
}
textRect.origin.x = bubbleRect.origin.x + TextRightMargin;
}它仍然在iPhone上崩溃,它只在iPhone-模拟器中工作。
编辑2:在中使用Rect绘制的内容
这跟直肠有关。如果我将bubbleRect改为Rect,从0/0开始,宽度和高度各为10个像素,则例外是未抛出。
如果使用更大的rect大小,就会出现异常。所以这片区域似乎有其他的保护
发布于 2014-05-02 19:01:46
将中间的代码更改为
if (_bubbleType == BubbleTypeLefthand)
{
if(self.lefthandImage != nil)
[self.lefthandImage drawInRect:bubbleRect];
textRect.origin.x = bubbleRect.origin.x + TextLeftMargin;
}
else
{
if(self.righthandImage != nil)
[self.righthandImage drawInRect:bubbleRect];
textRect.origin.x = bubbleRect.origin.x + TextRightMargin;
}那就看看它是否还会崩溃。如果它没有(它不应该),你知道这是因为图像由于某种原因而无法加载。确保正在加载的文件名与项目属性的“构建阶段”部分中包含在项目中的文件名正确。
https://stackoverflow.com/questions/23434904
复制相似问题