Iphone 自动释放池
我希望有人能帮我解决iPhone上的内存问题 我有一个滚动视图,它是导航控制器的一部分 每当我第一次按下导航控制器并在scrollview中滚动时(边走边添加图像),内存都会被分配成大块(比如说每个1mb) 如果我旋转显示器几次,内存就被释放了,一切都很好:scrollview工作正常,内存返回到应该的位置(大约1mb,查看仪器中的净分配) 如何防止内存失控,或者在使用scrollview时释放内存,就像设备旋转一样 以下是为加载scrollview页面而调用的代码段:Iphone 自动释放池,iphone,Iphone,我希望有人能帮我解决iPhone上的内存问题 我有一个滚动视图,它是导航控制器的一部分 每当我第一次按下导航控制器并在scrollview中滚动时(边走边添加图像),内存都会被分配成大块(比如说每个1mb) 如果我旋转显示器几次,内存就被释放了,一切都很好:scrollview工作正常,内存返回到应该的位置(大约1mb,查看仪器中的净分配) 如何防止内存失控,或者在使用scrollview时释放内存,就像设备旋转一样 以下是为加载scrollview页面而调用的代码段: - (void)load
- (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];
}
-(void)加载页面:(int)页面当前:(BOOL)当前{
如果(第<0页)返回;
如果(第>=totalRows页)返回;
picViewController*控制器=[[picViewController alloc]init];
如果((NSNull*)[viewControllers objectAtIndex:page]===[NSNull null]){
NSString*fullPath=[self-fullPath];
如果([fileManager fileExistsAtPath:fullPath]){
currentImage=[UIImage imageWithContentsOfFile:fullPath];
[控制器设置img:currentImage];
[viewControllers replaceObjectAtIndex:page with Object:controller];
}
否则{
AsyncImageView*asyncImage=[[AsyncImageView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]];
asyncImage.tag=8;
[asyncImage loadImageFromName:imageName with url:url];
[controller.view addSubview:asyncImage];
[图像发布];
[viewControllers replaceObjectAtIndex:page with Object:controller];
}
if(nil==controller.view.superview){
CGRect frame=scrollView.frame;
frame.origin.x=frame.size.width*页;
frame.origin.y=0;
controller.view.frame=frame;
[scrollView添加子视图:controller.view];
}
[控制器释放];
}
}控制器是否注意内存不足通知?您可以刷新接收到的任何不可见的图像,或者执行您认为相关的任何其他发布。我看不出您在代码中实际清除屏幕外页面的位置 您的代码有点像苹果的
PageControl
示例,对吗
我所做的是在每次页面“激活”时循环浏览页面,并清除超过1或2个屏幕的页面。(1个用于无弹跳滚动,2个用于有弹跳滚动。)
-(无效)更新检查页{
int active=pageControl.currentPage;
int count=pageControl.numberOfPages;
for(int i=0;i
在
ScrollViewDiEndDecelling
中调用updateCachedPages
,页面控件的页面更改操作和视图将出现好的,我毕竟没有释放所有内存
一旦我发现一个类实例没有被正确释放,并确保tewha的清除代码正常工作,一切都是好的
谢谢你的快速帮助。顺便说一句,这个论坛很棒。你应该关闭这个问题,这样它就不会出现在未回答的列表上。
- (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 );
}
}