iOS detachNewThreadSelector утечка - PullRequest
       21

iOS detachNewThreadSelector утечка

1 голос
/ 23 февраля 2011

У меня есть UIScrollView, в который я загружаю некоторые изображения. Иногда я применяю эффект к изображению, и требуется предварительная загрузка, поэтому я решил сделать это в другом потоке, используя detachNewThreadSelector. Я использую KTPhotoBrowser, который находится на gitHub для этого.

Так что, в принципе, у меня есть такая функция.

- (void)setCurrentIndex:(NSNumber *)newIndex
{

   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

   currentIndex_ = [newIndex integerValue];

   [self loadPhoto:currentIndex_];
   [self loadPhoto:currentIndex_ + 1];
   [self loadPhoto:currentIndex_ - 1];
   [self unloadPhoto:currentIndex_ + 2];
   [self unloadPhoto:currentIndex_ - 2];

  [self setTitleWithCurrentPhotoIndex];
  [self toggleNavButtons];
  [pool release];

}

Я называю это с помощью

[NSThread detachNewThreadSelector:@selector(setCurrentIndex:) toTarget:self withObject:[NSNumber numberWithInt:5]];

Когда я запускаю это, это, кажется, вызывает утечку. Я начинаю задумываться, стоит ли мне помещать пул AutoRelease вокруг кода в методе loadPhoto. Если вам интересен этот код, я включил его ниже.

- (void)loadPhoto:(NSInteger)index
{
   if (index < 0 || index >= photoCount_) {
      return;
   }

   id currentPhotoView = [photoViews_ objectAtIndex:index];
   if (NO == [currentPhotoView isKindOfClass:[KTPhotoView class]]) {
      // Load the photo view.
      CGRect frame = [self frameForPageAtIndex:index];
      KTPhotoView *photoView = [[KTPhotoView alloc] initWithFrame:frame];
      [photoView setScroller:self];
      [photoView setIndex:index];
      [photoView setBackgroundColor:[UIColor clearColor]];

      // Set the photo image.
      if (dataSource_) {
         if ([dataSource_ respondsToSelector:@selector(imageAtIndex:photoView:)] ==    NO) {
            UIImage *image = [dataSource_ imageAtIndex:index];
            [photoView setImage:image];
         } else {
        [dataSource_ imageAtIndex:index photoView:photoView];
         }
      }

      [scrollView_ addSubview:photoView];
      [photoViews_ replaceObjectAtIndex:index withObject:photoView];
      [photoView release];
   } else {
      // Turn off zooming.
      [currentPhotoView turnOffZoom];
   }
}

Любые идеи будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2012

Используйте следующее

[self performSelectorInBackground:@selector(setCurrentIndex:) withObject:[NSNumber numberWithInt:5]];

вместо

[NSThread detachNewThreadSelector:@selector(setCurrentIndex:) toTarget:self withObject:[NSNumber numberWithInt:5]];

, и это устраняет утечку памяти.

0 голосов
/ 24 февраля 2011

Ваш код выглядит нормально, но вы используете UIKit из другого потока.Классы UIKit должны использоваться только из основного потока приложения.

Справочник по UIKit Framework Введение

...