gpt4 book ai didi

iphone - 您使用 "potential leak"版本避免 "distant"警告的习惯用法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:10:33 27 4
gpt4 key购买 nike

处理大图像的动画,您可以这样做:简单地为每个大图像分配内存...

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;

现在,这一切都完美而高效地工作,如果您重复使用不同的大型动画,它不会泄漏或过度使用内存。

唯一的问题是,您当然会收到 clang 警告:“第 69 行分配的对象的潜在泄漏”,实际上您会收到很多这样的警告,每个分配一个。

避免这些警告并使其更安全、更严格的最佳习惯用法是什么?

有人知道吗?

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

...事实上,当您释放 NSArray(即 [imagesForLargeAnimation release])时...此时它会自动释放数组中的所有对象?那是对的吗?或者??

(或者我应该使用某种 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)];

关于iphone - 您使用 "potential leak"版本避免 "distant"警告的习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5094606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com