Проблемы с памятью при использовании ASIHTTPRequest или изменении размера изображения


Я не могу сказать, где, но у меня проблемы с памятью, загружающей изображения на мой сервер. После примерно 10 или около того успешных загрузок я получаю предупреждения памяти уровня 1, а затем в следующий раз он выходит из-за DateFormatters или в основном из памяти. Вот мой код. Он использует ASIHTTPDataRequest и функцию изменения размера изображения. Я не могу сказать, если его запрос, который не освобождается или если его функция изменения размера изображения не освобождает изображение. Изображения-это огромные фотографии, сделанные с телефона в обычном режиме. затем высокое разрешение было изменено до размера печати и загружено. Где-то по ходу дела мне не хватает какого-то управления памятью, и это сводит меня с ума!

Я получаю предупреждения памяти примерно после 10 или более загрузок на мой сервер, используя следующий код. Есть ли какое-то управление памятью, специфичное для ASI, которое я не использую?

Привет, я использую ваше программное обеспечение, но у меня большие проблемы с памятью. Я получаю предупреждения памяти,и я не знаю, как очистить их, не нарушая загрузку. Я не могли бы вы взглянуть на этот пример кода и, возможно, показать мне, что я делаю неправильно, что вызывает проблему с памятью?

Я получаю предупреждения памяти примерно после 10 или более загрузок на мой сервер, используя следующий код. Есть ли какое-то управление памятью, специфичное для ASI, которое я не использую?

Привет, я использую ваше программное обеспечение, но у меня большие проблемы с памятью. Я получаю предупреждения памяти,и я не знаю, как очистить их, не нарушая загрузку. Мне было интересно, если вы не могли бы вы взглянуть на этот пример кода и, возможно, показать мне, что я делаю неправильно, что вызывает проблему с памятью?

Я получаю предупреждения памяти примерно после 10 или более загрузок на мой сервер, используя следующий код. Есть ли какое-то управление памятью, специфичное для ASI, которое я не использую?

Привет, я использую ваше программное обеспечение, но у меня возникли огромные проблемы с памятью. Я получаю предупреждения памяти,и я не знаю, как очистить их, не нарушая загрузку. Я хотел спросить, не могли бы вы взглянуть на этот пример кода и, может быть, показать мне, что я делаю неправильно, что вызывает проблему с памятью?

-(void)uploadPhoto:(UploadObject*)upObject{
 UIImage *image=[UIImage imageWithContentsOfFile:[upObject.imageObj.imageList objectAtIndex:0]];
 if([upObject.imageObj.imgType isEqualToString:@"SINGLE"]){
  image=[self image:image ByScalingAndCroppingForSize:CGSizeMake(1800, 1200)];
 }else if([upObject.imageObj.imgType isEqualToString:@"STANDARD8X10"]){
  image=[self image:image ByScalingAndCroppingForSize:CGSizeMake(3000, 2400)];
 }else if([upObject.imageObj.imgType isEqualToString:@"MOUSE"]){
  image=[self image:image ByScalingAndCroppingForSize:CGSizeMake(2850, 2400)];
 }else{
  image=[self image:image ByScalingAndCroppingForSize:CGSizeMake(1800, 1200)];
 }
 NSFileManager *fileManager = [NSFileManager defaultManager];
 [fileManager setDelegate:self];
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSData *data = [NSData dataWithData:UIImageJPEGRepresentation(image, 100.0f)];//1.0f = 100% quality
 [data writeToFile:[upObject.imageObj.imageList objectAtIndex:0] atomically:YES];
 __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://api.postalpix.com/order/new"]];
 [request setPostValue:upObject.imageObj.pixID forKey:@"uid"];
 [request setPostValue:upObject.orderID forKey:@"orderid"];
 [request setPostValue:upObject.cost forKey:@"total"];
 [request setPostValue:@"NONE" forKey:@"coupon"];
 [request setPostValue:[NSString stringWithFormat:@"%d",upObject.total] forKey:@"images"];
 [request setPostValue:upObject.block forKey:@"block"];
 [request setPostValue:currentCoupon forKey:@"coupon"];
 [request setPostValue:[NSString stringWithFormat:@"%d",[upObject.imageObj.copies intValue]] forKey:@"quantity"];
 [request setTimeOutSeconds:20];
 request.showAccurateProgress = YES;
 [request setUploadProgressDelegate:self];
 [request setDelegate:self];
 [request setFile:[upObject.imageObj.imageList objectAtIndex:0] forKey:@"upfile"];
 if ([upObject.imageObj.imgType isEqualToString:@"SINGLE"])
 {
  [request setPostValue:@"29375" forKey:@"sku"];
  [request setPostValue:@"4x6 Print" forKey:@"description"];

 }else if ([upObject.imageObj.imgType isEqualToString:@"MOUSE"])
 {
  [request setPostValue:@"28925" forKey:@"sku"];
  [request setPostValue:@"Photo Mouse Pad" forKey:@"description"];
 }else if ([upObject.imageObj.imgType isEqualToString:@"STANDARD8X10"])
 {
  [request setPostValue:@"29376" forKey:@"sku"];
  [request setPostValue:@"8x10 Print" forKey:@"description"];
 }
 request.shouldContinueWhenAppEntersBackground=YES;
 [request setCompletionBlock:^{
  NSDictionary *jo=[[request responseString] JSONValue];
  NSFileManager *fileManager = [NSFileManager defaultManager];
  [fileManager removeItemAtPath:[currentUp.imageObj.imageList objectAtIndex:0] error:NULL];
  [self removeFinishedUpload:currentUp.block];
  currentUp=[self getNextUploadObject];
  if(currentUp){
   [self uploadPhoto:currentUp];
  }else{
   currentUploadCount=0;
   [[NSNotificationCenter defaultCenter] postNotificationName:@"UPDATEMOREBADGE" object:nil];
   isUploading=NO;
   [[NSNotificationCenter defaultCenter] postNotificationName:@"HIDE_PROGRESS" object:nil];
  }
 }];
 [request setFailedBlock:^{
  NSError *error = [request error];
  [self restartUpload];
 }];
 [request startAsynchronous];
}


- (UIImage*)image:(UIImage *)image ByScalingAndCroppingForSize:(CGSize)targetSize
{
 UIImage *sourceImage = image;
 UIImage *newImage = nil;        
 CGSize imageSize = sourceImage.size;
 CGFloat width = imageSize.width;
 CGFloat height = imageSize.height;
 CGFloat targetWidth = targetSize.width;
 CGFloat targetHeight = targetSize.height;
 CGFloat scaleFactor = 0.0;
 CGFloat scaledWidth = targetWidth;
 CGFloat scaledHeight = targetHeight;
 CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

 if (CGSizeEqualToSize(imageSize, targetSize) == NO) 
 {
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor > heightFactor) 
   scaleFactor = widthFactor; // scale to fit height
        else
   scaleFactor = heightFactor; // scale to fit width
        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image
        if (widthFactor > heightFactor)
  {
   thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
  }
        else 
   if (widthFactor < heightFactor)
   {
    thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
   }
 }       

 UIGraphicsBeginImageContext(targetSize); // this will crop

 CGRect thumbnailRect = CGRectZero;
 thumbnailRect.origin = thumbnailPoint;
 thumbnailRect.size.width  = scaledWidth;
 thumbnailRect.size.height = scaledHeight;

 [sourceImage drawInRect:thumbnailRect];

 newImage = UIGraphicsGetImageFromCurrentImageContext();
 if(newImage == nil) 
      UIGraphicsEndImageContext();
 return newImage;
}
1 2

1 ответ:

Я думаю, что строка

if(newImage == nil) 
    UIGraphicsEndImageContext();

Неверно. UIGraphicsEndImageContext() должен быть вызван без каких-либо условий.