Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何释放不再使用的UIImage的内存_Ios_Objective C_Memory Management_Uiimage - Fatal编程技术网

Ios 如何释放不再使用的UIImage的内存

Ios 如何释放不再使用的UIImage的内存,ios,objective-c,memory-management,uiimage,Ios,Objective C,Memory Management,Uiimage,我正在尝试将一些较小的图像合并为较大的图像。应用程序崩溃是因为内存不足,但我不知道如何在使用后释放内存,所以它会一直累积,直到应用程序崩溃 addImageToImage和resizeImage例程似乎是导致崩溃的原因,因为在不再需要它们的内存后,我无法释放它们的内存。我在这个项目中使用自动引用计数。我曾尝试将图像设置为零,但这并不能阻止崩溃 testImages位于从主ViewController调用的一个类中,而AddImageToImages和ResizeImages位于另一个名为Imag

我正在尝试将一些较小的图像合并为较大的图像。应用程序崩溃是因为内存不足,但我不知道如何在使用后释放内存,所以它会一直累积,直到应用程序崩溃

addImageToImage和resizeImage例程似乎是导致崩溃的原因,因为在不再需要它们的内存后,我无法释放它们的内存。我在这个项目中使用自动引用计数。我曾尝试将图像设置为零,但这并不能阻止崩溃

testImages位于从主ViewController调用的一个类中,而AddImageToImages和ResizeImages位于另一个名为ImageUtils的类中

有人能看看这段代码并向我解释如何正确地释放这两个例程分配的内存吗。我不能对图像调用release,因为该项目使用ARC,并且将它们设置为nil没有任何效果

+ (void)testImages
    {
    const int IMAGE_WIDTH = 394;
    const int IMAGE_HEIGHT = 150;
    const int PAGE_WIDTH = 1275;
    const int PAGE_HEIGHT = 1650;
    const int COLUMN_WIDTH = 30;
    const int ROW_OFFSET = 75;

    CGSize imageSize = CGSizeMake(PAGE_WIDTH, PAGE_HEIGHT);
    UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFillRect(context, CGRectMake(0, 0, imageSize.width, imageSize.height));
    UIImage *psheet = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CGSize collageSize = CGSizeMake(IMAGE_WIDTH, IMAGE_HEIGHT);
    UIGraphicsBeginImageContextWithOptions(collageSize, YES, 0);
    CGContextRef pcontext = UIGraphicsGetCurrentContext();
    CGContextFillRect(pcontext, CGRectMake(0, 0, collageSize.width, collageSize.height));
    UIImage *collage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    float row = 1;
    float column = 1;
    int index = 1;
    int group = 1;
    for (int i = 0; i < 64; i++)
    {
        NSLog(@"processing group %i - file %i ", group, index++);

        psheet = [ImageUtils  addImageToImage:psheet withImage2:collage andRect:CGRectMake((IMAGE_WIDTH*(column-1)) + (COLUMN_WIDTH * column), (IMAGE_HEIGHT * (row-1)) + ROW_OFFSET, IMAGE_WIDTH, IMAGE_HEIGHT) withImageWidth:PAGE_WIDTH withImageHeight:PAGE_HEIGHT];


        column++;
        if (column > 3) {
            column = 1;
            row++;
        }
        if (index == 15)
        {
            group++;
            index = 1;
            row = 1;
            column = 1;
            UIImage *editedImage = [ImageUtils resizeImage:psheet withWidth:PAGE_WIDTH * 2 withHeight:PAGE_HEIGHT * 2];
            editedImage = nil;
        }
    }
}

可能您的图像未解除分配,但已移动到

许多程序创建自动删除的临时对象。这些 对象添加到程序的内存占用空间中,直到 块在许多情况下,允许临时对象累积 直到当前事件循环结束,迭代不会导致 管理费用过高;但是,在某些情况下,您可能会创建 大量临时对象,这些临时对象大大增加了内存 您希望更快速地处理的足迹。在这些 在后一种情况下,您可以创建自己的自动释放池块。在 块结束时,将释放临时对象,通常 结果导致它们的释放,从而减少程序的内存 足迹

尝试使用
@autoreleasepool{}
将代码包装到循环中:

for (int i = 0; i < 64; i++)
{
@autoreleasepool {
    NSLog(@"processing group %i - file %i ", group, index++);

    psheet = [ImageUtils  addImageToImage:psheet withImage2:collage andRect:CGRectMake((IMAGE_WIDTH*(column-1)) + (COLUMN_WIDTH * column), (IMAGE_HEIGHT * (row-1)) + ROW_OFFSET, IMAGE_WIDTH, IMAGE_HEIGHT) withImageWidth:PAGE_WIDTH withImageHeight:PAGE_HEIGHT];


    column++;
    if (column > 3) {
        column = 1;
        row++;
    }
    if (index == 15)
    {
        group++;
        index = 1;
        row = 1;
        column = 1;
        UIImage *editedImage = [ImageUtils resizeImage:psheet withWidth:PAGE_WIDTH * 2 withHeight:PAGE_HEIGHT * 2];
        editedImage = nil;
    }
}
}
for(int i=0;i<64;i++)
{
@自动释放池{
NSLog(@“处理组%i-文件%i”,组,索引++);
psheet=[ImageUtils AddImageToImage2:psheet with Image2:collage and:CGRectMake((图像宽度*(列-1))+(列宽度*列),(图像高度*(行-1))+行偏移,图像宽度,图像高度)带图像宽度:页面宽度带图像高度:页面高度];
列++;
如果(列>3){
列=1;
行++;
}
如果(指数=15)
{
组++;
指数=1;
行=1;
列=1;
UIImage*EditeImage=[ImageUtils resizeImage:psheet with WIDTH:PAGE_WIDTH*2 with HEIGHT:PAGE_HEIGHT*2];
编辑图像=零;
}
}
}

可能您的图像未解除分配,而是移动到

许多程序创建自动删除的临时对象。这些 对象添加到程序的内存占用空间中,直到 块在许多情况下,允许临时对象累积 直到当前事件循环结束,迭代不会导致 管理费用过高;但是,在某些情况下,您可能会创建 大量临时对象,这些临时对象大大增加了内存 您希望更快速地处理的足迹。在这些 在后一种情况下,您可以创建自己的自动释放池块。在 块结束时,将释放临时对象,通常 结果导致它们的释放,从而减少程序的内存 足迹

尝试使用
@autoreleasepool{}
将代码包装到循环中:

for (int i = 0; i < 64; i++)
{
@autoreleasepool {
    NSLog(@"processing group %i - file %i ", group, index++);

    psheet = [ImageUtils  addImageToImage:psheet withImage2:collage andRect:CGRectMake((IMAGE_WIDTH*(column-1)) + (COLUMN_WIDTH * column), (IMAGE_HEIGHT * (row-1)) + ROW_OFFSET, IMAGE_WIDTH, IMAGE_HEIGHT) withImageWidth:PAGE_WIDTH withImageHeight:PAGE_HEIGHT];


    column++;
    if (column > 3) {
        column = 1;
        row++;
    }
    if (index == 15)
    {
        group++;
        index = 1;
        row = 1;
        column = 1;
        UIImage *editedImage = [ImageUtils resizeImage:psheet withWidth:PAGE_WIDTH * 2 withHeight:PAGE_HEIGHT * 2];
        editedImage = nil;
    }
}
}
for(int i=0;i<64;i++)
{
@自动释放池{
NSLog(@“处理组%i-文件%i”,组,索引++);
psheet=[ImageUtils AddImageToImage2:psheet with Image2:collage and:CGRectMake((图像宽度*(列-1))+(列宽度*列),(图像高度*(行-1))+行偏移,图像宽度,图像高度)带图像宽度:页面宽度带图像高度:页面高度];
列++;
如果(列>3){
列=1;
行++;
}
如果(指数=15)
{
组++;
指数=1;
行=1;
列=1;
UIImage*EditeImage=[ImageUtils resizeImage:psheet with WIDTH:PAGE_WIDTH*2 with HEIGHT:PAGE_HEIGHT*2];
编辑图像=零;
}
}
}

太棒了!我永远也想不到。非常感谢。杰出的我永远也想不到。非常感谢。