目标C代码处理iPhone中的大量数据处理

目标C代码处理iPhone中的大量数据处理,iphone,xcode,Iphone,Xcode,我有下面的代码,它接收14MB或更多以base4字符串编码的图像数据,并在写入iphone中的文件之前将其转换为jpeg。它使我的程序崩溃,出现以下错误: 程序接收到信号:“0”。 警告:检查安全呼叫:无法还原当前帧 我调整了我的程序,它可以在错误再次出现之前处理更多的图像。我的编码如下: 我试着使用UIImageJPEGRepresentation,发现值越低,可以处理的图像越多,但这不应该是正确的方法。我想知道在处理每个图像后是否有任何方法可以立即释放imageStrList的内存,以便下一

我有下面的代码,它接收14MB或更多以base4字符串编码的图像数据,并在写入iphone中的文件之前将其转换为jpeg。它使我的程序崩溃,出现以下错误: 程序接收到信号:“0”。 警告:检查安全呼叫:无法还原当前帧

我调整了我的程序,它可以在错误再次出现之前处理更多的图像。我的编码如下:

我试着使用UIImageJPEGRepresentation,发现值越低,可以处理的图像越多,但这不应该是正确的方法。我想知道在处理每个图像后是否有任何方法可以立即释放imageStrList的内存,以便下一个图像可以使用它

NSMutableArray *imageStrList = (NSMutableArray*) [parameters objectAtIndex:5]; 
while (imageStrList.count != 0) {
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
    NSString *imgString = [imageStrList objectAtIndex:0];  
    // Create a file name using my own Utility class
    NSString *fileName = [Utility generateFileNName];
    NSData *restoredImg = [NSData decodeWebSafeBase64ForString:imgString];
    UIImage *img = [UIImage imageWithData: restoredImg];
    NSData *imgJPEG = UIImageJPEGRepresentation(img, 0.4f); 
   [imgJPEG writeToFile:fileName atomically:YES];
   [imageStrList removeObjectAtIndex:0];
   [pool release];
}
您应该在循环内创建另一个autoreleasepool,因为在循环内创建的对象在程序退出循环之前不会被释放。 循环内的自动释放池将每次释放在循环内创建的所有对象

您应该在循环内创建另一个autoreleasepool,因为在循环内创建的对象在程序退出循环之前不会被释放。
循环内的自动释放池每次都会释放在循环内创建的所有对象。

您的问题是
UIImage
s和
NSData
s在循环内存中堆积。通常情况下,自动释放池会在事件循环结束时处理这个问题,但你不能让它走那么远。你有两个选择:

  • 显式分配/init,然后在完成时释放UIImage和NSData对象,而不是使用+类方法
  • 在循环内创建一个显式的自动释放池,并在结束时将其排空。通过以下方式执行此操作:

    NSAutoreleasePool*myPool=[[NSAutoreleasePool alloc]init]

    [myPool发布]


  • 您的问题是
    UIImage
    s和
    NSData
    s在内存中以循环方式堆积。通常情况下,自动释放池会在事件循环结束时处理这个问题,但你不能让它走那么远。你有两个选择:

  • 显式分配/init,然后在完成时释放UIImage和NSData对象,而不是使用+类方法
  • 在循环内创建一个显式的自动释放池,并在结束时将其排空。通过以下方式执行此操作:

    NSAutoreleasePool*myPool=[[NSAutoreleasePool alloc]init]

    [myPool发布]

  • NSMutableArray *imageStrList = (NSMutableArray*) [parameters objectAtIndex:5]; 
    while (imageStrList.count != 0) {
        NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
        NSString *imgString = [imageStrList objectAtIndex:0];  
        // Create a file name using my own Utility class
        NSString *fileName = [Utility generateFileNName];
        NSData *restoredImg = [NSData decodeWebSafeBase64ForString:imgString];
        UIImage *img = [UIImage imageWithData: restoredImg];
        NSData *imgJPEG = UIImageJPEGRepresentation(img, 0.4f); 
       [imgJPEG writeToFile:fileName atomically:YES];
       [imageStrList removeObjectAtIndex:0];
       [pool release];
    }