【发布时间】:2009-06-20 19:39:45
【问题描述】:
我正在为 iPhone 创建一个应用程序,其中包含多个按钮,它们都为同一个 UIImageView 设置动画。它在模拟器中运行良好(就像几乎所有应用程序一样),但在设备上它可以很好地播放动画,但重复按下按钮应用程序退出。到目前为止,我已经实现了 2 个按钮。这是按下它们时会发生的情况。 好的,当我的应用程序启动时,我有 44 MB 的可用内存,然后当我按下启动动画的 2 个按钮中的第一个时,可用内存下降到 31 并上升到 32,然后当我按下第二个按钮时,可用内存下降到 9,然后爬升到 24,然后奇怪地缓慢下降到 10。如果然后按下第一个按钮,则可用内存将攀升至 14MB 并且在重复按下这些按钮的情况下,应用程序内存将下降至 4 到 3 MB 并退出。在仪器中没有泄漏。这是我的代码,以防任何人都可以发现我的内存问题潜伏在哪里。 (顺便说一句,我仍在 2.2.1 上开发,因为如果我升级到 3.0,我将无法在设备上测试我的应用程序,因为我还没有注册苹果开发者计划,我按照在线教程获得应用到仅适用于 2.2.1 的设备上)
@synthesize 123pig;
- (IBAction)startClick:(id)sender{
animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick) userInfo:nil repeats:NO];
123pig.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed: @"123pigapple0001.png"],
[UIImage imageNamed: @"123pigapple0002.png"],
[UIImage imageNamed: @"123pigapple0003.png"],
[UIImage imageNamed: @"123pigapple0004.png"],
[UIImage imageNamed: @"123pigapple0005.png"],
[UIImage imageNamed: @"123pigapple0006.png"],
[UIImage imageNamed: @"123pigapple0007.png"],
[UIImage imageNamed: @"123pigapple0008.png"],
[UIImage imageNamed: @"123pigapple0009.png"],
[UIImage imageNamed: @"123pigapple0010.png"],
[UIImage imageNamed: @"123pigapple0011.png"],
[UIImage imageNamed: @"123pigapple0013.png"],
[UIImage imageNamed: @"123pigapple0014.png"],
[UIImage imageNamed: @"123pigapple0015.png"],
[UIImage imageNamed: @"123pigapple0016.png"],
[UIImage imageNamed: @"123pigapple0017.png"],
[UIImage imageNamed: @"123pigapple0018.png"],
[UIImage imageNamed: @"123pigapple0019.png"],
[UIImage imageNamed: @"123pigapple0020.png"],nil];
[123pig setAnimationRepeatCount:1];
123pig.animationDuration =.7;
[123pig startAnimating];
}
- (void)tick{
[self animatePig];
}
- (void)animatePig{
UIImage *pigImage13=[UIImage imageNamed:@"123pigapple0020.png"];
if(123pig.image == pigImage13)
123pig.image = pigImage13;
else
123pig.image = pigImage13;
}
- (IBAction)startClick1:(id)sender{
animationTimer1 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick1) userInfo:nil repeats:NO];
123pig.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed: @"123pig0015.png"],
[UIImage imageNamed: @"123pig0016.png"],
[UIImage imageNamed: @"123pig0017.png"],
[UIImage imageNamed: @"123pig0018.png"],
[UIImage imageNamed: @"123pig0019.png"],
[UIImage imageNamed: @"123pig0020.png"],
[UIImage imageNamed: @"123pig0021.png"],
[UIImage imageNamed: @"123pig0022.png"],
[UIImage imageNamed: @"123pig0023.png"],
[UIImage imageNamed: @"123pig0024.png"],
[UIImage imageNamed: @"123pig0025.png"],
[UIImage imageNamed: @"123pig0026.png"],
[UIImage imageNamed: @"123pig0027.png"],
[UIImage imageNamed: @"123pig0028.png"],
[UIImage imageNamed: @"123pig0029.png"],
[UIImage imageNamed: @"123pig0030.png"],
[UIImage imageNamed: @"123pig0031.png"],
[UIImage imageNamed: @"123pig0032.png"],
[UIImage imageNamed: @"123pig0033.png"],
[UIImage imageNamed: @"123pig0034.png"],
[UIImage imageNamed: @"123pig0035.png"],
[UIImage imageNamed: @"123pig0036.png"],
[UIImage imageNamed: @"123pig0037.png"],
[UIImage imageNamed: @"123pig0038.png"],
[UIImage imageNamed: @"123pig0039.png"],
[UIImage imageNamed: @"123pig0040.png"],
[UIImage imageNamed: @"123pig0041.png"],
[UIImage imageNamed: @"123pig0042.png"],
[UIImage imageNamed: @"123pig0043.png"],
[UIImage imageNamed: @"123pig0044.png"],
[UIImage imageNamed: @"123pig0045.png"],
[UIImage imageNamed: @"123pig0046.png"],
[UIImage imageNamed: @"123pig0047.png"],
[UIImage imageNamed: @"123pig0048.png"],
nil];
[123pig setAnimationRepeatCount:1];
123pig.animationDuration =2.7;
[123pig startAnimating];
}
- (void)tick1{
[self animatePig1];
}
- (void) animatePig1{
UIImage *pigImage11=[UIImage imageNamed:@"123pig0048.png"];
if(123pig.image == pigImage11)
123pig.image = pigImage11;
else
123pig.image = pigImage11;
}
- (void)stopTimer
{
[animationTimer invalidate];
[animationTimer release];
[animationTimer1 invalidate];
[animationTimer1 release];
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:touch.view];
123pig.center = location;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)dealloc {
[super dealloc];
[123pig release];
}
@end
我知道是 imageNamed 造成的,即使在内存警告之后,2.2.1 也不会清除它的缓存,在另一个 SO 问题上有人说“我的理解是 +imageNamed: 缓存应该尊重内存iPhone OS 3.0 上的警告。有机会时进行测试,如果发现不是这种情况,请报告错误。”现在,即使我确实下载了 3.0 的固件和 SDK,我也不知道它是否正在清除 imageNamed 的缓存,因为我无法在设备上对其进行测试!顺便说一句,在回答时请记住我是 iPhone sdk 的新手。提前致谢。
----------------编辑---------------- 我刚刚被苹果 iphone 开发者计划录取。 WOOOHOOO,我会检查 3.0 是否正确释放缓存的图像。
----------编辑------------------ 是的,它确实释放了缓存的图像。请在下面查看我的答案以获得进一步的说明。
【问题讨论】:
标签: iphone