处理大图像的动画,您可以执行以下操作:只需为每个大图像分配内存...
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)];