当我在对UIView进行动画操作时,出现了内存过度释放的问题。

5

我已经启用了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;
}

我不总是遇到崩溃,只有有时候。我想知道是什么被释放了?


回溯只能让我返回到主函数,之后的代码都是汇编语言。 - Sheehan Alam
尝试设置一些断点。 - Jacob Relkin
2个回答

15

你在那里有一个自动释放池,这促使我问,这是一个单独的线程吗?如果答案是肯定的,那么你就不能在那里对UIView进行操作。UIKit不是线程安全的。你可以做其他事情,比如计算位置或更新图像,然后将其放置在屏幕上,但任何用户界面的内容都必须在主线程中发生。

iPhone应用程序编程指南中的图形和绘图部分


你说得对,这是一个单独的线程。我只想在我的UIImageView中从URL加载图像。如果我删除动画代码,它有时只会加载图像。 - Sheehan Alam
你是否需要为从URL加载图像而专门创建一个独立的线程?为什么不直接使用异步的NSURLConnection或其他具有委托模式的类呢? - Rengers

6

您可以使用非常简单的安全检查来保护所有与UI有关的功能:

-(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;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接