Память зависает после dismissModalViewControllerAnimated: YES - PullRequest
2 голосов
/ 19 апреля 2011

Я представляю модальный контроллер вида, который содержит UIScrollView с кучей изображений. Когда я освобождаю свой модальный контроллер вида, я вижу в своих Распределениях (инструментах), что память, назначенная изображениям, висит, но не вызывает утечек.

Может вызвать у меня некоторую путаницу и любую помощь. Вот что у меня есть ...

UIViewController - DollViewController: Это мой основной контроллер вида, который я представляю своим модальным. Вот код -

-(IBAction)openDollCloset {
    NSLog(@"Open Closet");



    [self playSound:@"soundMenuClick"];
    ClosetViewController *closet = [[ClosetViewController alloc] initWithNibName:@"ClosetViewController" bundle:nil];

    closet.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self setModalPresentationStyle:UIModalPresentationFullScreen];
    [self presentModalViewController: closet animated: YES];

    closet.delegate = self;
    closet.addToCloset = NO;
    [closet setCurrentDoll:myDoll];
    [closet openCloset];
    [closet release];

    [self closeSubmenu];

}

Я создаю свой скроллвью вручную для хранения изображений одежды. Объект closetScroller определяется с помощью @property (nonatomic, retain) UIScrollView * closetScroller; с выпуском в dealloc.

- (void)setScrollerValues { 
    if (closetScroller == nil) 
    {
        self.closetScroller = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
        [self.closetScroller setDecelerationRate:UIScrollViewDecelerationRateFast];
        [self.closetScroller setDelegate:self];
        [self.closetScroller setPagingEnabled:YES];
        [self.closetScroller setShowsHorizontalScrollIndicator:NO];
        [self.view addSubview:closetScroller];
    }
    [self.closetScroller setContentSize:CGSizeMake(outfitCount * 320, 400)];
}

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

- (void)addOutfitsToScroller {

        // Clear out any old images in case we just deleted an outfit
    if ([[closetScroller subviews] count] > 0) 
    {
        CATransition *fade = [CATransition animation];
        [fade setDelegate:self];
        [fade setType:kCATransitionReveal];
        [fade setSubtype:kCATransitionFromRight];
        [fade setDuration:0.40f];
        [[self.closetScroller subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
        [[closetScroller layer] addAnimation:fade forKey:@"FadeButtons"];
    }
        // Set the pageControl to same number of buttons
    [pageControl setNumberOfPages:outfitCount];

        // Load the outfit image and add it to the scroller
    for (int i = 0; i < outfitCount; i++) 
    {
        NSArray *savedDataArray = [[NSArray alloc] initWithArray:[closetItemsArray objectAtIndex:i]];
        UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(320*i, 0, 320, 400)];
        [v setUserInteractionEnabled:NO];
        [v setAlpha:0.40f];

        NSData *imageData = [[NSData alloc] initWithContentsOfFile:[savedDataArray objectAtIndex:1]];
        UIImage *outfitImage = [[UIImage alloc] initWithData:imageData];
        UIImageView *closetImage = [[UIImageView alloc] initWithImage:outfitImage];
        [imageData release];
        [outfitImage release];
        [savedDataArray release];

        CGSize frameOffset;
        #ifdef LITE_VERSION
        frameOffset = CGSizeMake(40, 60);
        #else
        frameOffset = CGSizeMake(20, 10);
        #endif
        closetImage.frame = CGRectOffset(closetImage.frame, frameOffset.width , frameOffset.height);

        [v addSubview:closetImage];
        [closetImage release];

        [self.closetScroller addSubview:v];
        [v release];
    }
}

Все это прекрасно работает. Затем, когда пользователь выбирает кнопку «Закрыть» или выбирает наряд, я звоню:

[self.delegate closeClosetWindow];

, который вызывает метод делегата в parentViewController, который просто делает этот вызов:

[self dismissModalViewControllerAnimated:YES];

Я также пытался вызвать dismissModalViewControllerAnimated: YES из самого контроллера модального представления. Он просто перенаправляет сообщение в parentViewController и закрывает модальное окно точно так же, как и первый способ. Ни то, ни другое не влияет на память.

Так что вместо этого я использую этот метод, чтобы закрыть представление:

[[self.closetScroller subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
[self dismissModalViewControllerAnimated:YES];

Когда я это делаю, я вижу, как уменьшается Распределение моих объектов в Инструментах. Перед открытием шкафа я выделил объект на отметке 1,85 Мб. Когда я открываю шкаф, он увеличивается до 2,5 или около того, в зависимости от того, сколько изображений одежды загружено в UIScrollView. Затем, когда я закрываю вид без вышеуказанного метода, он остается равным 2,5 и увеличивается при следующем открытии. Хотя при использовании описанного выше метода, который удаляет изображения одежды из скроллера, мой объект alloc снова падает вниз, закрывая 1.85mb. Может быть, немного больше, что говорит мне, что это также связано с некоторыми другими вещами.

Также обратите внимание, что при взгляде на распределение объектов я вижу созданный объект ClosetViewController, и когда я закрываю модальное окно, его ссылка освобождается. Я могу видеть это как malloc и освобождаю вид, когда открываю и закрываю его. Это не сохраняет сам объект представления. я так растерялся.

Не уверен, что здесь делать. Я не получаю никаких утечек, и я выпускаю все просто отлично. Любые идеи будут великолепны.

знак

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Я думаю, что вы просто не выпускали closetScroller при освобождении контроллера представления.

0 голосов
/ 26 апреля 2011

Я заметил, что объект распределяется в инструментах, сохраняя живую ссылку на UIScrollView каждый раз, когда я открывал модальное окно.Поэтому, чтобы исправить, при выделении для моего scrollview я вместо этого выделил новый объект UIScrollView и назначил его closetScroller, а затем выпустил.Это позаботилось о проблеме

...