如何在UIImageView动画后清理内存

时间:2012-01-20 20:20:27

标签: ios animation memory-management uiimageview xcode-instruments

这是我的代码: 部首:

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
    UIImageView *imageView;
    NSMutableArray *arrayWithImages;
}
- (IBAction)startAnimation:(id)sender;
- (IBAction)cleanMemory:(id)sender;
@end

实现:

#import "ViewController.h"

@implementation ViewController

......

- (IBAction)startAnimation:(id)sender {
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];

    arrayWithImages = [[NSMutableArray alloc] initWithObjects:
                                       [UIImage imageNamed:@"pic1"],
                                       [UIImage imageNamed:@"pic2"],
                                       [UIImage imageNamed:@"pic3"],
                                       [UIImage imageNamed:@"pic4"],
                                       [UIImage imageNamed:@"pic5"],
                                       [UIImage imageNamed:@"pic6"],
                                       [UIImage imageNamed:@"pic7"],
                                       [UIImage imageNamed:@"pic8"],nil];
    imageView.animationImages = arrayWithImages;
    imageView.animationDuration = 3;
    imageView.animationRepeatCount = 1;
    [self.view addSubview:imageView];

    [imageView startAnimating];
}

- (IBAction)cleanMemory:(id)sender {

    [arrayWithImages removeAllObjects];
    [arrayWithImages release];
    arrayWithImages= nil;

    [imageView removeFromSuperview];
    [imageView release];
    imageView = nil;
}
@end

我有ViewControllerview有两个按钮。带有startAnimation操作的第一个按钮,用于创建UIImageViewNSMutableArray并在其上启动动画。带有cleanMemory操作的第二个按钮,用于清除我在startAnimation中创建的所有内容。 当我使用Profile工具启动Activity Monitor时,我的程序会4 mb Real Mem,当我按startAnimation按钮时,它会更改为16 mb Real Mem,动画后我按{{1} }}按钮,但它有相同的cleanMemory ...为什么?我不会清理我的记忆以启动价值(4 MB Real Mem)。请你解释一下,我有问题吗?

2 个答案:

答案 0 :(得分:1)

UIImage imageNamed:缓存图像并按照自己的计划释放内存。如果您不想进行缓存,则完全控制内存,然后直接加载图像,而不是UIImage imageNamed:

来自Apple文档:

  

此方法在系统缓存中查找具有的图像对象   指定名称并返回该对象(如果存在)。如果匹配   图像对象尚未在缓存中,此方法加载图像   来自指定文件的数据,缓存它,然后返回   结果对象。

您可以使用

+ (UIImage *)imageWithContentsOfFile:(NSString *)path

直接加载图片。

来自Apple文档:

  

此方法不会缓存图像对象。

答案 1 :(得分:1)

如果即使在使用+ (UIImage *)imageWithContentsOfFile:(NSString *)path之后仍然无法释放记忆,请拨打imageView.animationImages = nil;