如何在Objective-C CGIMageRef中对齐内存以修复EXC_ARC_DA_ALIGN错误

时间:2014-09-23 15:51:53

标签: objective-c c core-graphics memory-alignment cgimageref

我已经在我的应用中使用了这段代码而且没有失败。它从我传入的CGImageRef和黑白面具中删除了一组片段。

我正在尝试将代码迁移到环境中,其中布局将基于自动布局和约束。

在我尝试在iPad 3,iPhone 5或4s上运行它之前,它与autolayout完美配合。

经过大量研究后,我认为由于此错误导致内存对齐问题导致崩溃。

EXC_BAD_ACCESS(代码= EXC_ARM_DALIGN,地址= 0x5baa20)

我相信我需要以某种方式调整每个组件的Bites / Bytes,以确保结果总是排在内存中,以避免激怒那些统治问题设备的ARMV7神。

我在网上找到了一些例子,但我还没有成功地适应这种情况。

我有一条替代路径,我可以对我的大小进行硬编码而不会导致崩溃,但我不得不放弃自动布局上的硬编码工作。

请帮助

    - (UIImage*) maskImage2:(CGImageRef)image withMask:(UIImage *)maskImage withFrame:(CGRect)currentFrame {
@autoreleasepool {

    CGFloat scale = [self adjustScale];


    CGRect scaledRect = CGRectMake(currentFrame.origin.x*scale, currentFrame.origin.y*scale, maskImage.size.width*scale, maskImage.size.height*scale);
    //Rect scaled up to account for iPad 3 sizing

    NSLog( @"%@ origin", NSStringFromCGRect(scaledRect));
    CGImageRef tempImage = CGImageCreateWithImageInRect(image, scaledRect);// Cut out the image at the size of the pieces
    CGImageRef maskRef = maskImage.CGImage;  //Creates the mask to cut out the fine edge and add backing layer

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);
    CGImageRef colorsHighlights = CGImageCreateWithMask(tempImage, mask);//Colors with tran transparent surround

    CFRelease(tempImage);

    CGSize tempsize = CGSizeMake(maskImage.size.width, maskImage.size.height);

    CFRelease(mask);
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(tempsize.width+5, tempsize.height+5), NO, scale);
    CGContextRef context = UIGraphicsGetCurrentContext();

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        CGContextSetShadow(context, CGSizeMake(1, 2), 2);
    }else{
        CGContextSetShadow(context, CGSizeMake(.5, .5), 1);
    }
    [[UIImage imageWithCGImage:colorsHighlights scale:scale orientation:UIImageOrientationUp] drawInRect:CGRectMake(0, 0, tempsize.width, tempsize.height)]; // <<<< Crash is here
    CFRelease(colorsHighlights);

    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return finalImage;
}

}

0 个答案:

没有答案