Xcode崩溃等级= 1 + 2没有潜在的泄漏(可能是因为动画)

时间:2011-09-03 13:01:27

标签: iphone objective-c xcode memory-leaks

首先,我是一个n00b。经过长时间的尝试和研究,我决定得到一些外部帮助。 我的项目: 我为孩子们写了一本书。在我分析了代码后,我摆脱了所有潜在的泄漏,但我仍然有一个Level = 1 + 2崩溃。通过测试我的应用程序,我发现我的动画可能是个问题,因为在翻阅书籍并观看大约30个动画后它会崩溃。
我忘了发布一些东西吗? 也许你看到我看不到的东西。 这是我的代码

- (void)addButton1 {
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button1 setFrame:CGRectMake(174, 100, 421, 250)];
    [button1 setBackgroundImage:[UIImage imageNamed:@"button.png"] 
                   forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(buttonPressed1)
      forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];
}

- (void)animieren1:(UIImageView *)image {
    [self animationZustand1];
    [UIView commitAnimations];  
}

- (void)buttonPressed1 {
    [self animieren1:self.animation1];
}


- (void)normalZustand2 {
    [self.animation2 setImage:[UIImage imageNamed:@"muller3s.png"]];
}

- (void)initAnimation2 {
    animation2 = [[UIImageView alloc] initWithFrame:
                   CGRectMake(173, 550, 422, 262)];
    [self normalZustand2];
    self.animation2.opaque = YES;
    [self.view addSubview:self.animation2];
}   

- (void)animationZustand2 {
    NSArray *imageArray = [[NSArray alloc] initWithObjects:
                       [UIImage imageNamed:@"muller3s.png"],
                       [UIImage imageNamed:@"muller4s.png"],
                       nil];    
    self.animation2.animationImages = imageArray;
    self.animation2.animationDuration = 2.1;
    animation2.animationRepeatCount = 1;
    [self.animation2 startAnimating];
    [self normalZustand2];
     [imageArray release];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"riesel" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL   
    fileURLWithPath:path] error:NULL];
    theAudio.volume = 0.1;
    self.audioPlayer3 = theAudio;
    [theAudio play];
    [theAudio release];
}       

有什么想法吗? 如果有人能帮助我真的很酷! 在此先感谢Planky

1 个答案:

答案 0 :(得分:1)

听起来你还不清楚'1级'崩溃是什么。级别是指内存警告 - 当您即将耗尽应用程序的内存分配时,您的应用程序会从系统接收通知。

您的应用应该通过清除不再使用的对象来响应这些通知 - 如果不这样做,您将收到更多警告,直到您的应用被系统终止,因为根本没有更多内存可供您使用

虽然可能导致内存警告泄漏,但这通常不是根本问题。在压倒性的数量的情况下,它们是由于尝试同时将太多原始资产加载到内存中而引起的。

您需要仔细研究您的代码和结构,找出应对此问题的最佳方法。也许您目前只是将所有30页书籍同时加载到内存中:您需要考虑在需要时加载资源。如果用户看不到资产,也许您可​​以将其从内存中删除并在需要时重新加载。

在图形丰富的应用程序中,要记住文件大小图像在内存中占用的大小不相等也很重要。假设您有一个与iPad屏幕大小相同的PNG文件(1024x768)。当加载到内存中时,此图像将占用超过3兆字节的内存。所有iOS设备都受内存限制,比其他设备更多:在第一代iPad上,单个图像可能占用了总内存分配的5%(应用程序访问的确切数量会有所不同,取决于很多因素:因此为什么你当你接近极限时收到通知。

内存警告是更加“友好”的崩溃之一,因为iOS会尝试在发生之前警告您的应用。因此,在控制器中监听这些通知非常重要,并做出相应的响应。