Проблема переполнения памяти при анимации UIView - PullRequest
5 голосов
/ 28 апреля 2010

Я включил NSZombie, и я получаю следующее сообщение в моей консоли, когда я запускаю свое приложение:

 *** -[UIViewAnimationState release]: message sent to deallocated instance 0xf96d7e0

Вот метод, который выполняет анимацию

-(void)loadAvatar:(STObject*)st
{   
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    

    avatar.alpha = 0;
    avatar.frame = avatarRectSmall;

    avatar.image = [ImageCache getMemoryCachedImageAtUrl:st.avatar_url];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:.50];

    avatar.frame = avatarRectNormal;
    [avatar setAlpha:1];
    [UIView commitAnimations];


    [pool release];
    pool = nil;
}

У меня не всегда бывает сбой, только иногда. Мне интересно, что выпускают?

Ответы [ 2 ]

15 голосов
/ 28 апреля 2010

У вас есть пул авто-релизов, который заставляет меня спросить, это отдельная тема? Если ответ «да», то вы не можете делать что-то для UIView там. UIKit не является потокобезопасным. Вы можете делать другие вещи, такие как вычисление позиций или обновление изображений, которые вы позже выводите на экран, но в главном потоке должны происходить любые вещи пользовательского интерфейса.

Раздел графики и рисования в Руководстве по программированию приложений iPhone

6 голосов
/ 19 мая 2011

Вы можете использовать очень простую проверку безопасности для всех функций, которые делают что-то с пользовательским интерфейсом:

-(void)functionModifyingUIelements:(id)object
{
 // fire itself in main thread if it is not in it already
 if (![[NSThread currentThread] isMainThread]) { 

        [self performSelectorOnMainThread:@selector(functionModifyingUIelements:) withObject:object waitUntilDone:NO];
        return;
    }

}
...