Предупреждения об утечке памяти из-за NSArray из больших изображений - PullRequest
1 голос
/ 10 июня 2011

У меня есть приложение для iPad - детская книга. Вы переходите с одной страницы на следующую, вызывая это действие, которое существенно затухает на текущей странице и исчезает на следующей странице, а затем заполняет три стека UIImageViews следующей строкой NSArray, поэтому он готов выполнить действие для следующая страница:

-(void)delayedMethod{

    [leftButton setAlpha:1];

    [pageImageNext setAlpha:0];
    [pageImage setAlpha:1];
    [pageImageBack setAlpha:1];

    NSString *imageExtension = @".jpg";
    NSString *audioExtension = @".wav";

    if (activePage == thePages.count/3)
    {
        activePage = 1;
    }
    else 
    {
        activePage = activePage + 1;
    }

    NSInteger row = 0;
    if(activePage == 0)
    {
        row = activePage;
    }
    else
    {
        row = ((activePage) * 3);
    }   

    [leftButton setAlpha:1];

    pageImageBack.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", [thePages objectAtIndex:row+0], imageExtension]];
    pageImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", [thePages objectAtIndex:row+1], imageExtension]];
    pageImageNext.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", [thePages objectAtIndex:row+2], imageExtension]];

    [UIImageView beginAnimations:NULL context:NULL];
    [UIImageView setAnimationDuration:.5]; // you can set this to whatever you like
    /* put animations to be executed here, for example: */

    [leftButton setAlpha:0];
    [rightButton setAlpha:0];
    [leftButton setAlpha:1];
    [rightButton setAlpha:1];
    leftButton.hidden = NO;


    /* end animations to be executed */
    [UIImageView commitAnimations]; // execute the animations listed above

    [imageExtension release];


}

NSArray загружается в это действие, которое вызывается в ViewDidLoad:

-(void)loadPages
{
    thePages = [[NSArray alloc] initWithObjects:
                   //   How many stacked images do we need to get fade in and outs? Also add column fo
                @"page0",@"page0",@"page1",
                @"page0",@"page1",@"page2",
                @"page1",@"page2",@"page3",
                @"page2",@"page3",@"page4",
                @"page3",@"page4",@"page5",
                @"page4",@"page5",@"page6",
                @"page5",@"page6",@"page7",
                @"page6",@"page7",@"page8",
                @"page7",@"page8",@"page9",
                @"page8",@"page9",@"page10",
                @"page9",@"page10",@"page11",
                @"page10",@"page11",@"page12",
                @"page11",@"page12",@"page13",
                @"page12",@"page13",@"page14",
                @"page13",@"page14",@"page15",
                @"page14",@"page15",@"page16",
                @"page15",@"page16",@"page17",
                @"page16",@"page17",@"page18",
                @"page17",@"page18",@"page19",
                @"page18",@"page19",@"page20",
                @"page19",@"page20",@"page21",
                @"page20",@"page21",@"page22",
                @"page21",@"page22",@"page23",
                @"page22",@"page23",@"page24",
                @"page23",@"page24",@"page25",
                @"page24",@"page25",@"page26",
                @"page25",@"page26",@"page27",
                @"page26",@"page27",@"page27",
                nil];

}

Все работает нормально, пока на 10-12-й странице не появится предупреждение о памяти в консоли и обычно происходит сбой.

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

Ответы [ 4 ]

1 голос
/ 10 июня 2011

Я делал такое приложение, где у меня было много изображений и ярлыков, которые пользователь мог изменить. Я получаю предупреждения и вылетает все время. Единственная вещь, которая, казалось, все это исправляла, состояла в том, чтобы придать им все свойства. Все, что я хотел, чтобы сохранить определенный вид, я должен был сделать собственность. Это хорошо позаботилось об этом, в противном случае казалось, что операционная система сошла с ума от того, что я должен был выделить много ресурсов, и будет отправлять предупреждения о памяти, которые будут освобождать данные, а затем, когда приложение попытается получить к ним доступ, оно будет зависать. Посмотрите, как работают свойства pageImageNext, pageImage, pageImageBack.

0 голосов
/ 15 июня 2011

@ sasquatch @YuzaKen @MishieMoo Если я просто установлю self.pageImage = nil;в dealloc, как вы предложили, разве это не освободит память только тогда, когда пользователь покинет ViewController?

Я чувствую, что мне нужно освобождать UIImageViews, когда я перемещаюсь вниз по строкам массива, когдаЯ заменяю содержимое UIImageView новым изображением, нет?

0 голосов
/ 10 июня 2011

код:

[imageExtension release];

Неверно и должно быть удалено. «imageExtension» размещается в стеке и исчезнет при выходе из метода. Выпускайте только те вещи, которые у вас есть.

У вас есть только один из этих типов контроллеров? Или по одному на каждую страницу?

0 голосов
/ 10 июня 2011

Убедитесь, что вы выполняете [thePages release]]; в методе dealloc контроллера представления.Если не выпустить, это определенно вызовет проблемы с памятью.

Также вы сохранили свойства viewviews в контроллере вида?Если это так, вам необходимо также разблокировать их в dealloc.

Что касается предупреждений о памяти, вы можете сбросить изображения в didRecieveMemoryWarning, а затем просто добавить чек, чтобы воссоздать их по мере необходимости..

...