2015-04-27 2 views
1

У меня есть цикл вложенных циклов, в котором я много раз вызываю метод getSnapShotData и записываю эти данные на диск. Я заметил, что я слишком много наращиваю память, делая это, и у меня заканчивается память, поэтому я подумал, что это будет хороший вариант использования dispatch semaphore.Запретить цикл от цикла до тех пор, пока внутренний цикл не будет записываться на диск

У меня все еще не хватает памяти, поэтому я не уверен, правильно ли использую семафор. По сути, я хочу, чтобы следующий цикл ожидал, пока данные предыдущего цикла не будут записаны на диск, поскольку я думаю, что это освободит память. Но я могу ошибаться. Спасибо за помощь.

Код:

dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

for (NSDictionary *sub in self.array) 
{ 
    NSArray *lastArray = [sub objectForKey:@"LastArray"]; 

    for (NSDictionary *dict in lastArray) 
    { 
     currentIndex ++; 

     NSData *frame = [NSData dataWithData:[self getSnapshotData]]; 

     savePath = [NSString stringWithFormat:@"%@/%lu.png",frameSourcePath,(unsigned long)currentIndex]; 

     BOOL nextLoop = [frame writeToFile:savePath options:0 error:nil]; 

     frame = nil; 

     if (nextLoop) 
     { 
      dispatch_semaphore_signal(sema); 
     } 

     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
    } 
} 

- (NSData *)getSnapshotData 
{ 
    UIGraphicsBeginImageContextWithOptions(self.containerView.bounds.size, NO, 0.0); 
    [self.containerView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *snapShot = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return [NSData dataWithData:UIImagePNGRepresentation(snapShot)]; 
} 
+0

BTW - использование семафора ничего не изменило для вашего кода и управления памятью. – rmaddy

ответ

3

Вы слишком много autoreleased объектов. Добавьте пул авторесурсов, чтобы улучшить ситуацию вместо использования семафора.

for (NSDictionary *sub in self.array) 
{ 
    NSArray *lastArray = [sub objectForKey:@"LastArray"]; 

    for (NSDictionary *dict in lastArray) 
    { 
     @autoreleasepool { 
      currentIndex ++; 

      NSData *frame = [NSData dataWithData:[self getSnapshotData]]; 

      savePath = [NSString stringWithFormat:@"%@/%lu.png",frameSourcePath,(unsigned long)currentIndex]; 

      BOOL nextLoop = [frame writeToFile:savePath options:0 error:nil]; 
     } 
    } 
} 
+0

Должен ли я по-прежнему беспокоиться о вызове 'frame = nil;' после 'nextLoop' boolean даже с autoreleasepool? – klcjr89

+0

№ 'frame' выходит за пределы области действия в конце блока. Установка его на 'nil' была бы бессмысленной. – rmaddy

Смежные вопросы