处理大图像的动画,您可以执行以下操作:只需为每个大图像分配内存...

NSArray *imagesForLargeAnimation;

#define IMG(X) [[UIImage alloc] \
  initWithContentsOfFile:[[NSBundle mainBundle] \
    pathForResource:@X ofType:@"tif"]]

imagesForLargeAnimation  = [[NSArray alloc] initWithObjects:
                    IMG("01"),
// (since we are allocing that image, of course we must release it eventually.)
                    IMG("02"),
                    IMG("03"),
                    ....
                    IMG("42"),
                    nil];

animationArea.animationImages = imagesForLargeAnimation;
//blah blah...

稍后,一旦动画已停止并且不再显示在屏幕上,要清理内存,您必须执行以下操作:
-(void) cleanUpTheMemoryInTheBigAnimation
 {
 //blah blah..

 // for each of those big images in the array, release the memory:
 for (UIImage *uu in imagesForLargeAnimation)
    [uu release];

 // release the array itself
 [imagesForLargeAnimation release];
 imagesForLargeAnimation = nil;

现在,所有这些都可以完美而有效地运行,如果您反复使用不同的大型动画,则不会泄漏也不会浪费内存。

唯一的问题是,您当然会收到警告:“在第69行分配的对象可能泄漏”,实际上您得到了这些警告的分数,每一个alloc都有一个。

避免这些警告并使其更安全,更紧密的最佳习惯是什么?

有人知道吗?

例如,如果您使用自动发布,那么在上面的代码示例中,您将在IMG定义中使用自动发布...

...实际上,当您释放NSArray(即[imagesForLargeAnimation版本])...时,它将自动释放数组中的所有对象吗?那是对的吗?要么??

(或者我应该使用某种newBlah函数将图像放入,还是.. ??)

如果有人知道这里避免“潜在泄漏”的正确方法,谢谢!!!

{PS提醒人们,基本上从不使用imageNamed :,这是没有希望的:它仅适用于小型UI使用类型的图像。永远不要使用imageNamed!}

最佳答案

您不需要保留图像-NSArray会为您完成。

试试这个 :

#define IMG(X) [[[UIImage alloc] \
  initWithContentsOfFile:[[NSBundle mainBundle] \
    pathForResource:@X ofType:@"tif"]] autorelease]

而且您现在不需要此代码:
// for each of those big images in the array, release the memory:
//for (UIImage *uu in imagesForLargeAnimation)
//    [uu release];

仅供参考(1):

如果您使用imageNamed,则不会收到警告,因为imageNamed返回已经自动释放的对象,但是alloc / initWithcontentsOfFile却没有:)

仅供参考(2):

NSArrays上有一个方法可以对所有对象执行选择器:
[imagesForLargeAnimation makeObjectsPerformSelector:@selector(release)];

10-08 05:59
查看更多