iphone对象c是已经发布的对象

时间:2010-08-15 21:09:46

标签: iphone memory-management

我使用[myimageview.image release]发布图像;

但在应用程序处于后台之后它再次出现前景,它再次释放该图像,所以它崩溃了!我所有尝试检查应用程序是否来自后台都没有用。 那我怎么能检查一个物体是否已经被释放..所以我不做两次?

thankx 克里斯

EDIT 几次抱怨我的编码错误:)这里有一个例子:

首先,我使用许多全屏图像的路径初始化一个数组 此外,还有10种不同的阵列可用于10种不同的场景。 当我把图像直接放在一个数组中时,它只需要从一开始就需要很多内存,或者当我完全释放一个场景时,它需要再次加载整个图像阵列而且速度变慢。所以我只是将图像的路径加载到一个数组中,并在运行时将每个图片循环分配给我的imageview。

初始一次:        imageArray_stand = [[NSArray alloc] initWithObjects:                        @ “FrankieArmeRaus_0001.jpg”                                             ...最多60张图片                        @ “FrankieArmeRaus_0061.jpg”,零];

在一个叫做每个1/10秒的循环中:

      if ([myimageview.image  retainCount] > 1) 
        //if ( myimageview.image != nil) // does not work = crash
        {   
             [myimageview.image release]; 
              myimageview.image = nil;
        }

        myimageview.image = [UIImage imageNamed:[imageArray_stand2 objectAtIndex:piccounter-1]];

问题出现了,因为当应用程序进入后台并再次进入前景时,它似乎会释放图像2次,所以我需要一个解决方案来检查它。

我很高兴任何解决方案(现在它的工作原理)更好。 甚至将所有图像完全加载到一个数组中,但如上所述,它需要很多内存并重新分配,而运行时需要很长时间才能加载。 (50张图像1秒)

此外,我需要RELASE并设置为NIL,否则它甚至会使我的内存使用超出限制。

3 个答案:

答案 0 :(得分:2)

你永远不会永远,释放另一个对象的属性。您释放整个myimageview对象,或者只是分配给它的属性。这些属性是如何管理内存的是myimageview对象的私有业务。

答案 1 :(得分:0)

最简单的方法是做这样的事情:

if (someObject != nil)
{
    [someObject release];
    someObject = nil;
}

但是,我不认为你应该发布myimageview.image,假设myimageview是UIImageView。 UIImageView负责管理其图像;你不应该搞乱它的保留计数。

也许你真正想做的是:

myimageview.image = nil;

这将导致myimageview释放停止指向现在无效的内存。

答案 2 :(得分:-2)

解决了

if([myimageview.image retainCount]> 1)[myimageview.image release];