首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >on图像上的iOS: EXC_BAD_ACCESS :用2幅图像绘制

on图像上的iOS: EXC_BAD_ACCESS :用2幅图像绘制
EN

Stack Overflow用户
提问于 2014-05-02 18:44:11
回答 1查看 1.1K关注 0票数 2

我知道在StackOverflow这里有很多关于这个话题的问题,我希望尝试了很多提示和答案。但在这种简单而简单的情况下,没有任何帮助。

--

在基于ARC的应用程序中,我使用了来自Ray的一个名为UIView的SpeechBubbleView子类。它对UIView进行了子类化,并绘制了一个包含文本的语音气泡,如短信应用程序中的文本。

它使用两个UIImage实例。在“查看所绘制的气泡”的绘图方法中。

在iPhone模拟器里,一切都很好。但是,在运行 7.1的iPhone 5上,每当绘制第二个图像时,总会出现EXC_BAD_ACCESS异常,而不管第一个图像是否被绘制。

我会提供一些守则:

代码语言:javascript
复制
@property (nonatomic, retain) UIImage* lefthandImage;
@property (nonatomic, retain) UIImage* righthandImage;

在initWithFrame-方法中,从支持的文件文件夹加载的两个图像:

代码语言:javascript
复制
self.lefthandImage = [[UIImage imageNamed:@"BubbleLefthand"]
                      stretchableImageWithLeftCapWidth:20 topCapHeight:19];

self.righthandImage = [[UIImage imageNamed:@"BubbleRighthand"]
                  stretchableImageWithLeftCapWidth:20 topCapHeight:19];

在SpeechBubbleView的drawRect方法中,图像绘制如下:

代码语言:javascript
复制
- (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-实例,而是使用以下代码创建每个实例的真正副本:

代码语言:javascript
复制
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的建议,我在抽签方法周围添加了零守卫:

代码语言:javascript
复制
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大小,就会出现异常。所以这片区域似乎有其他的保护

EN

回答 1

Stack Overflow用户

发布于 2014-05-02 19:01:46

将中间的代码更改为

代码语言:javascript
复制
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;
}

那就看看它是否还会崩溃。如果它没有(它不应该),你知道这是因为图像由于某种原因而无法加载。确保正在加载的文件名与项目属性的“构建阶段”部分中包含在项目中的文件名正确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23434904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档