使用Apple的PhotoScroller示例,为了重用为视图分配的内存,一旦保留计数达到0,我就无法释放内存。这里我的代码可以更好地理解: 这件作品是PhotoScroller的摘录 的 PhotoViewController.m
- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index
{
page.index = index;
page.frame = [self frameForPageAtIndex:index];
[page displayPage:index];
}
ImageScrollView.h
@interface ImageScrollView : UIView
{
UIViewController *vc;
NSUInteger index;
}
@property (assign) NSUInteger index;
- (void)displayPage:(int)indice;
@end
ImageScrollView.m
- (void)dealloc
{
[vc release];
[super dealloc];
}
- (void)displayPage:(int)indice
{
//remove previous view
[vc.view removeFromSuperview];
[vc release];
vc = nil;
//NSLog(@"vc retain %i", [vc retainCount]);
// make a new viewController for the new page
Class clss = NSClassFromString([NSString stringWithFormat:@"page_0%i", indice + 1]);
vc = [[clss alloc] initWithNibName:[NSString stringWithFormat:@"page_0%i", indice + 1] bundle:nil];
[self addSubview:vc.view];
}
类“page_0x”是UIViewControllers。到目前为止,只有XIB上的UIImageView。
page_01的一个例子:
@implementation page_01
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Overriden to allow any orientation.
return YES;
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
设备上的内存峰值达到148 MB。给我一个内存警告级别1,然后释放一些内存。降到95 MB。继续上下。
答案 0 :(得分:0)
也许你的page_0x视图控制器正在被释放,但他们创建的东西却没有。有些事要检查:
在page_0x视图控制器的dealloc
方法中设置断点。它被叫了吗?
检查page_0x视图控制器的所有IBOutlet和其他实例变量。它们是否都在班级dealloc
方法中正确发布?
运行Build&分析。它出现了什么吗?
尝试运行Leaks Instrument。它可以告诉你实际泄漏了什么样的物体。
(编辑)现在抓住稻草。你没有打开NSZombieEnabled,是吗?
(编辑2)你说你正在扔一个.png。如果你删除.png会怎么样?
如果您在模拟器中运行,请在设备上进行尝试。 (见this question。)