我希望有人可以帮我解决iPhone上的内存问题。
我有一个滚动视图,它是导航控制器的一部分。
每当我第一次按下导航控制器并滚动滚动视图(按照我的方式添加图像)时,内存将以巨大的块(例如每个1mb)分配。
如果我旋转显示器几次,内存被释放,一切都很好:滚动视图正常工作,内存返回到它应该的位置(大约1mb,查看仪器中的Net alloc)。 / p>
如何在滚动视图的使用过程中保持内存不变或释放内存,就像设备旋转一样?
以下是调用以加载scrollview页面的代码段:
- (void)loadPage:(int)page isCurrent:(BOOL)isCurrent {
if (page < 0) return;
if (page >= totalRows) return;
picViewController *controller = [[picViewController alloc] init];
if ((NSNull *)[viewControllers objectAtIndex:page] == [NSNull null]) {
NSString *fullPath = [self fullPath];
if([fileManager fileExistsAtPath:fullPath]) {
currentImage=[UIImage imageWithContentsOfFile:fullPath];
[controller setImg:currentImage];
[viewControllers replaceObjectAtIndex:page withObject:controller];
}
else {
AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
asyncImage.tag = 8;
[asyncImage loadImageFromName:imageName withURL:url];
[controller.view addSubview:asyncImage];
[asyncImage release];
[viewControllers replaceObjectAtIndex:page withObject:controller];
}
if (nil == controller.view.superview) {
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.view.frame = frame;
[scrollView addSubview:controller.view];
}
[controller release];
}
}
答案 0 :(得分:0)
您的控制器是否注意内存不足通知?您可以清除收到的任何不可见的图像,或者发布您认为相关的任何其他图像。
答案 1 :(得分:0)
我没有看到您的代码中实际上是在清除屏幕外页面。
您的代码有点像Apple的PageControl
示例,对吗?
我所做的是每次页面被“激活”时遍历页面并清除超过1或2个屏幕的页面。 (1表示没有反弹滚动,2表示没有反弹。)
- (void)updateCachedPages {
int active = pageControl.currentPage;
int count = pageControl.numberOfPages;
for ( int i = 0; i < count; i++ ) {
if ( abs( active - i ) <= 2 ) {
[self loadPage:i];
}
else {
[self purgePage:i];
}
}
}
- (void)purgePage:(int)page {
if ((page < 0) || (page >= [_myObjects count])) return;
MyControllerClass *controller = [_viewControllers objectAtIndex:page];
if ((NSNull *)controller != [NSNull null]) {
[_viewControllers replaceObjectAtIndex:page withObject:[NSNull null]];
//NSLog( @"Purged page %d", page );
}
}
致电updateCachedPages
中的scrollViewDidEndDecelerating
,您的PageControl页面更改操作以及viewWillAppear
。
答案 2 :(得分:0)
好吧,毕竟我没有释放所有的记忆。
一旦我发现一个类实例没有被正确释放,并确保tewha的清除代码正常工作,一切都很好。
感谢您的快速帮助。这个论坛很棒BTW。