【发布时间】:2011-04-08 01:03:23
【问题描述】:
我在内存管理方面遇到了这个大问题。
问题:
我有一个 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]];
}
}
【问题讨论】:
标签: ipad memory-management memory-leaks uiscrollview uiimageview