多个图像操作崩溃iPhone应用程序

时间:2009-06-25 13:29:52

标签: iphone objective-c cocoa-touch memory-management

我是iPhone应用程序开发的新手,所以我可能做错了。

基本上,我正在从互联网上加载一堆图像,然后裁剪它们。我设法找到了异步加载图像并将它们添加到视图中的示例。我设法通过NSData添加NSOperation的图片,并将其添加到NSOperationQueue中。

然后,因为我必须制作固定大小的拇指,我需要一种方法来裁剪这些图像,所以我在网上发现了一个基本上使用UIGraphicsBeginImageContext()UIGraphicsGetImageFromCurrentImageContext()和{{1绘制裁剪后的图像,以及不重要​​的尺寸计算。

问题是,该方法有效,但由于它生成了20个这样的图像,它会在生成一些图像之后随机崩溃,或者有时在我关闭并重新打开应用程序一两次之后会崩溃。 / p>

在这种情况下我该怎么办?我尝试使用UIGraphicsEndImageContext()NSOperations以某种方式使这些方法以异步方式运行,但没有运气。

如果裁剪代码比我想的更相关,那么它是:

NSOperationQueue

谢谢!

3 个答案:

答案 0 :(得分:5)

缩放图像的代码看起来太简单了。 这是我正在使用的那个。如您所见,没有泄漏,不再需要时释放对象。希望这会有所帮助。

    // Draw the image into a pixelsWide x pixelsHigh bitmap and use that bitmap to 
// create a new UIImage 
- (UIImage *) createImage: (CGImageRef) image width: (int) pixelWidth height: (int) pixelHeight
{ 
    // Set the size of the output image 
    CGRect aRect = CGRectMake(0.0f, 0.0f, pixelWidth, pixelHeight); 
    // Create a bitmap context to store the new thumbnail 
    CGContextRef context = MyCreateBitmapContext(pixelWidth, pixelHeight); 
    // Clear the context and draw the image into the rectangle 
    CGContextClearRect(context, aRect); 
    CGContextDrawImage(context, aRect, image); 
    // Return a UIImage populated with the new resized image 
    CGImageRef myRef = CGBitmapContextCreateImage (context); 

    UIImage *img = [UIImage imageWithCGImage:myRef];

    free(CGBitmapContextGetData(context)); 
    CGContextRelease(context);
    CGImageRelease(myRef);

    return img; 
} 


// MyCreateBitmapContext: Source based on Apple Sample Code
CGContextRef MyCreateBitmapContext (int pixelsWide,
                                    int pixelsHigh)
{
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;

    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

    colorSpace = CGColorSpaceCreateDeviceRGB();
    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL)
    {
        fprintf (stderr, "Memory not allocated!");
        CGColorSpaceRelease( colorSpace );
        return NULL;
    }
    context = CGBitmapContextCreate (bitmapData,
                                     pixelsWide,
                                     pixelsHigh,
                                     8,
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedLast);
    if (context== NULL)
    {
        free (bitmapData);
        CGColorSpaceRelease( colorSpace );
        fprintf (stderr, "Context not created!");
        return NULL;
    }
    CGColorSpaceRelease( colorSpace );

    return context;
}

答案 1 :(得分:2)

您的应用程序崩溃,因为您正在使用的调用(例如,UIGraphicsBeginImageContext)操纵UIKit的上下文堆栈,您只能从主线程安全地执行此操作。

unforgiven的解决方案在线程中使用时不会崩溃,因为它不会操纵上下文堆栈。

答案 2 :(得分:0)

听起来确实像内存崩溃一样令人怀疑。启动Leaks工具并查看整体内存趋势。