我正在使用Tom Brow在GitHub上提供的LeavesView类。
在iPad上,我有23张图像,1024x768,范围从200-500KB(JPG)。我尽可能地压缩图像而不会损失质量。出于某种原因,当我使用图像列表初始化时,内存显着下降,并最终崩溃。这是一些代码:
- (id)init {
if (self = [super init]) {
images = [[[NSArray alloc] initWithObjects:
[UIImage imageNamed:@"001.jpg"],
[UIImage imageNamed:@"002.jpg"],
[UIImage imageNamed:@"003.jpg"],
[UIImage imageNamed:@"004.jpg"],
[UIImage imageNamed:@"005.jpg"],
[UIImage imageNamed:@"006.jpg"],
[UIImage imageNamed:@"007.jpg"],
[UIImage imageNamed:@"008.jpg"],
[UIImage imageNamed:@"009.jpg"],
[UIImage imageNamed:@"010.jpg"],
[UIImage imageNamed:@"011.jpg"],
[UIImage imageNamed:@"012.jpg"],
[UIImage imageNamed:@"013.jpg"],
[UIImage imageNamed:@"014.jpg"],
[UIImage imageNamed:@"015.jpg"],
[UIImage imageNamed:@"016.jpg"],
[UIImage imageNamed:@"017.jpg"],
[UIImage imageNamed:@"018.jpg"],
[UIImage imageNamed:@"019.jpg"],
[UIImage imageNamed:@"020.jpg"],
[UIImage imageNamed:@"021.jpg"],
[UIImage imageNamed:@"022.jpg"],
[UIImage imageNamed:@"cover.jpg"],
nil] autorelease];
}
return self;
}
现在,在这段代码中,我使用了自动释放。我也尝试过:
-(void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
NSLog(@"memory warning");
LeavesCache *lv =[LeavesCache alloc];
[lv flush];
[lv release];
//[images release];
}
当然,在这个例子中,我只使用图像而不是我在视图中使用的其他对象:
-(void)viewDidUnload {
[super viewDidUnload];
images = nil;
}
-(void)dealloc {
[images release];
[super dealloc];
}
当我对图像阵列使用自动释放时,[图像发布];被注释掉,反之亦然,如果我不使用autorelease,我在dealloc中使用release。
现在,当我弹出视图时,内存将按预期重新获得。这只是图像在使用时似乎是一个HOG,我不知道不使用图像数组的另一种方式。
任何帮助都会受到赞赏。
答案 0 :(得分:0)
我能够通过以下方式解决我的emory泄漏:
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"001" ofType:@"jpg"]]
我看到使用这种方法恢复了大量的内存,并且能够阻止这些工作,希望这会有助于其他人!