ipad - 带有许多 UIImageViews 的 UIScrollView - 内存管理

标签 ipad memory-management memory-leaks uiscrollview uiimageview

我在内存管理方面遇到了这个大问题。

问题 :
我有一个 UIScrollView ,我有一个包含 24 个图像路径的数组,我想在 UIScrollView 中显示它们。启用分页。

所有图像的大小均为 1024x748(带状态栏的 iPad 横向分辨率),文件类型为 jpg 或 png。

我使用延迟加载只是为了不超过 viewDidLoad 时的内存.我将使用来自 Apple 的带有 PageControl 的延迟加载示例。虽然我正在使用 UIImageViews而不是 UIViews .

所以我的问题是,当我滚动到第三张图片时,我想从 UIScrollView 中删除第一张图片。并释放它的内存。因为我滚动得越远,消耗的内存就越多。当我在 UIScrollView 中翻页并加载并添加新图像时,使用了大约 5000kb 的内存,当我进入 unloadPage: 时(见下文)没有任何内容被释放。我只是“做错了”吗?

如何释放和删除 UIImageViews适本地?

(我正在使用 initWithContentsOfFile: 加载 UIImages)

这是我的代码 :

@interface SlideViewController : UIViewControllerExtended <UIScrollViewDelegate> {

    ScrollViewController *slider;
    IconView *currentChapter;
    NSMutableArray *chapters;
    NSMutableArray *views;
    UIImageView *controller;

}

延迟加载功能 :
- (void) loadImageToScrollView:(NSInteger)chapter withPage:(NSInteger)page {


    if (page < 0) return;
    if (page >= chapterCount) return;

    if([views objectAtIndex:page] != [NSNull null]) return;

    NSMutableArray *all = [[currentChapter getImages] copy];

    if(!([[all objectAtIndex:page] rangeOfString:@".mp4"].length > 0)) {
        controller = [views objectAtIndex:page];

        if((NSNull *)controller == [NSNull null]) {

            NSArray *paths = [[all objectAtIndex:page] componentsSeparatedByString:@"."];

            NSString *name = [[NSString alloc] initWithString:[paths objectAtIndex:0]];
            NSString *ending = [[NSString alloc] initWithString:[paths objectAtIndex:1]];

            NSString *file = [[NSString alloc] initWithFormat:@"%@", [[NSBundle mainBundle] pathForResource:name ofType:ending]];

            UIImageView *tempImage = [[UIImageView alloc] initWithFrame:CGRectMake(page * 1024, 0, 1024, 768)];
            UIImage *img = nil;
            img = [[UIImage alloc] initWithContentsOfFile:file];

            [tempImage setImage:img];
            [tempImage setTag:page];

            self.controller = tempImage;
            [tempImage release];

            [slider addSubview:controller];
            [views replaceObjectAtIndex:page withObject:controller];

            [name release];
            [ending release];
            [file release];
        }

    }

    [all release];
}

卸载查看方法 (这似乎不起作用):
- (void) unloadPage: (int) page {
    if(page < 0) return;
    if(page >= chapterCount) return;
    if((NSNull *)[views objectAtIndex:page] != [NSNull null]) {
        UIImageView *viewToDelete = [views objectAtIndex:page];

        [viewToDelete removeFromSuperview];

        [views replaceObjectAtIndex:page withObject:[NSNull null]];
    }
}

最佳答案

#104问题解决了视频 session 在 WWDC2010 .可以在 Apple Developer site 上找到。 .

因此,如果您在加载大图像时遇到内存泄漏问题,请检查一下。真的,真的很有用。

关于ipad - 带有许多 UIImageViews 的 UIScrollView - 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639254/

相关文章:

c++ - gcc/linux : CppuTest shows memory leak using static vectors, 误报?

memory-leaks - 内存泄漏与 powermockito 简单测试

iphone - 您是否有任何理由不想在每次构建 iOS 应用程序时都使用静态分析器?

ios - iOS App Store拒绝:无法重现错误“未加载库”

c++ - 为什么不在 C++ 游戏中频繁分配和释放内存?

android - 在内存有限的情况下,如何优雅地降低性能?

python - 调试已运行脚本的内存消耗\泄漏

iphone - 在 iPhone 和 iPad 中实现 VOIP

iphone - 解析时的内存问题

将字符缓冲区连接成字符串