3 Stimmen

iPhone SDK: Ich habe Speicherprobleme, kann jemand einem Neuling helfen, sie zu beheben?

Ich entwickle erst seit sehr kurzer Zeit auf der iPhone-Plattform und hatte schon viele Syntaxfehler und jetzt auch noch Speicherprobleme.

In meiner iPhone-App wird eine Bildansicht mehrfach durch verschiedene Schaltflächen animiert (6), und dies funktioniert gut auf dem iPhone ohne Probleme, aber als ich meine App mit Instrumenten zum ersten Mal getestet habe, wurden 1 oder 2 Speicherlecks gefunden, die Speicherlecks treten auf, wenn eine IBAction aufgerufen wird, die eine Animation und ihren Soundeffekt ausführt. Jetzt verstehe ich, was ein Speicherleck ist, weiß aber wenig darüber, wie man es verhindert,

Sollte ich sogar über ein paar kb Speicherverlust besorgt sein, wenn man bedenkt, dass ich plane, mehr Animationen später hinzufügen? Hilfe wird sehr geschätzt werden. Hier ist mein Code:

#import "00001111ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
@implementation 00001111ViewController

@synthesize leftSwitch;
@synthesize rightSwitch;
@synthesize switchView;
@synthesize myScrollView1;
@synthesize img;
- (void)viewDidLoad {

    blinkTimer = [NSTimer scheduledTimerWithTimeInterval:(1.00/1.00) target:self selector:@selector(blink) userInfo:nil repeats:NO];
    [blinkTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:rand()%10]];
}

- (void)blink{
    [self animateBlink];
}

- (void)animateBlink{

    UIImage *openeye = [UIImage imageNamed:@"img.png"];
    UIImage *closedeye = [UIImage imageNamed:@"cloudnewimprovedblinked.png"];

    if(img.image == openeye)    
        img.image = closedeye;
else if(img.image == closedeye)
        img.image = openeye;

else 
    img.image ==  closedeye;
    blinkTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(blink) userInfo:nil repeats:NO];
if (img.image == openeye)
    [blinkTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:rand()%10]];
}
-(IBAction)toggleShowHide2:(id)sender
{

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [switchView setAlpha:0];
    [UIView commitAnimations];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
}
-(IBAction)toggleShowHide1:(id)sender
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 1];
    [UIView commitAnimations];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [switchView setAlpha:.88];
    [UIView commitAnimations];
}
- (IBAction)startClick:(id)sender{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [switchView setAlpha:0];
    [UIView commitAnimations];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
    sound1=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"clickwithsilence" ofType:@"wav"]] error:NULL];
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick) userInfo:nil repeats:NO];

    img.animationImages = [NSArray arrayWithObjects:
                              [UIImage imageNamed: @"imgapple0001.png"],
                              [UIImage imageNamed: @"imgapple0002.png"],
                              [UIImage imageNamed: @"imgapple0003.png"],
                              [UIImage imageNamed: @"imgapple0004.png"],
                              [UIImage imageNamed: @"imgapple0005.png"],
                              [UIImage imageNamed: @"imgapple0006.png"],
                              [UIImage imageNamed: @"imgapple0007.png"],
                              [UIImage imageNamed: @"imgapple0008.png"],
                              [UIImage imageNamed: @"imgapple0009.png"],
                              [UIImage imageNamed: @"imgapple0010.png"],
                              [UIImage imageNamed: @"imgapple0011.png"],
                              [UIImage imageNamed: @"imgapple0013.png"],
                              [UIImage imageNamed: @"imgapple0014.png"],
                              [UIImage imageNamed: @"imgapple0015.png"],
                              [UIImage imageNamed: @"imgapple0016.png"],
                              [UIImage imageNamed: @"imgapple0017.png"],
                              [UIImage imageNamed: @"imgapple0018.png"],
                              [UIImage imageNamed: @"imgapple0019.png"],
                              [UIImage imageNamed: @"imgapple0020.png"],nil];

    [img setAnimationRepeatCount:1];
    img.animationDuration =.7;
    [img startAnimating];
    [sound1 play];
}
- (void)tick{
    [self animateYes];
}
- (void)animateYes{

    UIImage *YesImage13=[UIImage imageNamed:@"imgapple0020.png"];

    if(img.image == YesImage13)
        img.image = YesImage13;
    else
        img.image = YesImage13;
    if(img.image == YesImage13)

        blinkTimer2 = [NSTimer scheduledTimerWithTimeInterval:(1.00/1.00) target:self selector:@selector(blink2) userInfo:nil repeats:NO];
    [blinkTimer2 setFireDate:[NSDate dateWithTimeIntervalSinceNow:rand()%7]];
}

- (void)blink2{
    [self animateBlink2];
}

- (void)animateBlink2{

    UIImage *openeye2 = [UIImage imageNamed:@"imgapple0020.png"];
    UIImage *closedeye2 = [UIImage imageNamed:@"appleblinked.png"];

    if(img.image == openeye2)   
        img.image = closedeye2;
    else if(img.image == closedeye2)
        img.image = openeye2;

    else 
        img.image ==  closedeye2;
    blinkTimer2 = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(blink2) userInfo:nil repeats:NO];
    if (img.image == openeye2)
        [blinkTimer2 setFireDate:[NSDate dateWithTimeIntervalSinceNow:rand()%10]];

}
- (IBAction)startClick1:(id)sender{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.2];
    [switchView setAlpha:0];
    [UIView commitAnimations];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
    sound2=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"explosiontrimmed" ofType:@"wav"]] error:NULL];
    animationTimer1 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick1) userInfo:nil repeats:NO];
    img.animationImages = [NSArray arrayWithObjects:
                              [UIImage imageNamed: @"img0015.png"],
                              [UIImage imageNamed: @"img0016.png"],
                              [UIImage imageNamed: @"img0017.png"],
                              [UIImage imageNamed: @"img0018.png"],
                              [UIImage imageNamed: @"img0019.png"],
                              [UIImage imageNamed: @"img0020.png"],
                              [UIImage imageNamed: @"img0021.png"],
                              [UIImage imageNamed: @"img0022.png"],
                              [UIImage imageNamed: @"img0023.png"],
                              [UIImage imageNamed: @"img0024.png"],
                              [UIImage imageNamed: @"img0025.png"],
                              [UIImage imageNamed: @"img0026.png"],
                              [UIImage imageNamed: @"img0027.png"],
                              [UIImage imageNamed: @"img0028.png"],
                              [UIImage imageNamed: @"img0029.png"],
                              [UIImage imageNamed: @"img0030.png"],
                              [UIImage imageNamed: @"img0031.png"],
                              [UIImage imageNamed: @"img0032.png"],
                              [UIImage imageNamed: @"img0033.png"],
                              [UIImage imageNamed: @"img0034.png"],
                              [UIImage imageNamed: @"img0035.png"],
                              [UIImage imageNamed: @"img0036.png"],
                              [UIImage imageNamed: @"img0037.png"],
                              [UIImage imageNamed: @"img0038.png"],
                              [UIImage imageNamed: @"img0039.png"],
                              [UIImage imageNamed: @"img0040.png"],
                              [UIImage imageNamed: @"img0041.png"],
                              [UIImage imageNamed: @"img0042.png"],
                              [UIImage imageNamed: @"img0043.png"],
                              [UIImage imageNamed: @"img0044.png"],
                              [UIImage imageNamed: @"img0045.png"],
                              [UIImage imageNamed: @"img0046.png"],
                              [UIImage imageNamed: @"img0047.png"],
                              [UIImage imageNamed: @"img0048.png"],
                              //and so on to 100
                              nil];

    [img setAnimationRepeatCount:1];
    img.animationDuration =2.7;
    [img startAnimating];
    [sound2 play];
}
- (void)tick1{
    [self animateYes1];
}
- (void) animateYes1{

    UIImage *YesImage11=[UIImage imageNamed:@"img0048.png"];

    if(img.image == YesImage11)
        img.image = YesImage11;
    else
        img.image = YesImage11;
    if(img.image == YesImage11)

    blinkTimer1 = [NSTimer scheduledTimerWithTimeInterval:(1.00/1.00) target:self selector:@selector(blink1) userInfo:nil repeats:NO];
    [blinkTimer1 setFireDate:[NSDate dateWithTimeIntervalSinceNow:rand()%7]];
}

- (void)blink1{
    [self animateBlink1];
}

- (void)animateBlink1{

    UIImage *openeye1 = [UIImage imageNamed:@"img0048.png"];
    UIImage *closedeye1 = [UIImage imageNamed:@"explosionblinked.png"];

    if(img.image == openeye1)   
        img.image = closedeye1;
    else if(img.image == closedeye1)
        img.image = openeye1;

    else 
        img.image ==  closedeye1;
    blinkTimer1 = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(blink1) userInfo:nil repeats:NO];
    if (img.image == openeye1)
        [blinkTimer1 setFireDate:[NSDate dateWithTimeIntervalSinceNow:rand()%7]];
}

- (IBAction)startClick2:(id)sender{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.2];
    [switchView setAlpha:0];
    [UIView commitAnimations];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
    sound3=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"watersplashsilence" ofType:@"wav"]] error:NULL];
    animationTimer2 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick2) userInfo:nil repeats:NO];

    img.animationImages = [NSArray arrayWithObjects:

                              [UIImage imageNamed: @"imgshark0001.png"],
                              [UIImage imageNamed: @"imgshark0002.png"],
                              [UIImage imageNamed: @"imgshark0003.png"],
                              [UIImage imageNamed: @"imgshark0004.png"],
                              [UIImage imageNamed: @"imgshark0005.png"],
                              [UIImage imageNamed: @"imgshark0006.png"],
                              [UIImage imageNamed: @"imgshark0007.png"],
                              [UIImage imageNamed: @"imgshark0008.png"],
                              [UIImage imageNamed: @"imgshark0009.png"],
                              [UIImage imageNamed: @"imgshark0010.png"],
                              [UIImage imageNamed: @"imgshark0011.png"],
                              [UIImage imageNamed: @"imgshark0012.png"],
                              [UIImage imageNamed: @"imgshark0013.png"],
                              [UIImage imageNamed: @"imgshark0014.png"],
                              [UIImage imageNamed: @"imgshark0015.png"],
                              [UIImage imageNamed: @"imgshark0016.png"],
                              [UIImage imageNamed: @"imgshark0017.png"],
                              [UIImage imageNamed: @"imgshark0018.png"],
                              [UIImage imageNamed: @"imgshark0019.png"],
                              [UIImage imageNamed: @"imgshark0020.png"],
                              [UIImage imageNamed: @"imgshark0021.png"],
                              [UIImage imageNamed: @"imgshark0022.png"],
                              [UIImage imageNamed: @"imgshark0023.png"],
                              [UIImage imageNamed: @"imgshark0024.png"],
                              [UIImage imageNamed: @"imgshark0025.png"],
                              [UIImage imageNamed: @"imgshark0026.png"],
                              [UIImage imageNamed: @"imgshark0027.png"],
                              [UIImage imageNamed: @"imgshark0028.png"],
                              [UIImage imageNamed: @"imgshark0029.png"],
                              [UIImage imageNamed: @"imgshark0030.png"],
                              [UIImage imageNamed: @"imgshark0031.png"],
                              [UIImage imageNamed: @"imgshark0032.png"],
                              [UIImage imageNamed: @"imgshark0033.png"],
                              [UIImage imageNamed: @"imgshark0034.png"],nil];

    [img setAnimationRepeatCount:1];
    img.animationDuration =2.8;
    [img startAnimating];
    [sound3 play];
}
- (void)tick2{
    [self animateYes2];
}
- (void)animateYes2{

    UIImage *YesImage14=[UIImage imageNamed:@"imgshark0034.png"];

    if(img.image == YesImage14)
        img.image = YesImage14;
    else
        img.image = YesImage14;

}
- (IBAction)startClick3:(id)sender{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.2];
    [switchView setAlpha:0];
    [UIView commitAnimations];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
    sound4=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"dogsilence" ofType:@"wav"]] error:NULL];

    animationTimer3 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick3) userInfo:nil repeats:NO];

    img.animationImages = [NSArray arrayWithObjects:
                              [UIImage imageNamed: @"imgdog0001.png"],
                              [UIImage imageNamed: @"imgdog0002.png"],
                              [UIImage imageNamed: @"imgdog0003.png"],
                              [UIImage imageNamed: @"imgdog0004.png"],
                              [UIImage imageNamed: @"imgdog0005.png"],
                              [UIImage imageNamed: @"imgdog0006.png"],
                              [UIImage imageNamed: @"imgdog0007.png"],
                              [UIImage imageNamed: @"imgdog0008.png"],
                              [UIImage imageNamed: @"imgdog0009.png"],
                              [UIImage imageNamed: @"imgdog0010.png"],
                              [UIImage imageNamed: @"imgdog0011.png"],
                              [UIImage imageNamed: @"imgdog0012.png"],
                              [UIImage imageNamed: @"imgdog0013.png"],
                              [UIImage imageNamed: @"imgdog0014.png"],
                              [UIImage imageNamed: @"imgdog0015.png"],
                              [UIImage imageNamed: @"imgdog0016.png"],
                              [UIImage imageNamed: @"imgdog0017.png"],
                              [UIImage imageNamed: @"imgdog0018.png"],
                              [UIImage imageNamed: @"imgdog0019.png"],
                              [UIImage imageNamed: @"imgdog0020.png"],
                              [UIImage imageNamed: @"imgdog0021.png"],
                              [UIImage imageNamed: @"imgdog0022.png"],
                              [UIImage imageNamed: @"imgdog0023.png"],
                              [UIImage imageNamed: @"imgdog0024.png"],
                              [UIImage imageNamed: @"imgdog0025.png"],
                              [UIImage imageNamed: @"imgdog0026.png"],
                              [UIImage imageNamed: @"imgdog0026.png"],
                              [UIImage imageNamed: @"imgdog0028.png"],
                              [UIImage imageNamed: @"imgdog0029.png"],
                              [UIImage imageNamed: @"imgdog0030.png"],
                              [UIImage imageNamed: @"imgdog0031.png"],
                              [UIImage imageNamed: @"imgdog0032.png"],
                              [UIImage imageNamed: @"imgdog0033.png"],
                              [UIImage imageNamed: @"imgdog0034.png"],nil];

    [img setAnimationRepeatCount:1];
    img.animationDuration =2.7;
    [img startAnimating];
    [sound4 play];
}
- (void)tick3{
    [self animateYes3];

}
- (void)animateYes3{

    UIImage *YesImage14=[UIImage imageNamed:@"imgdog0034.png"];

    if(img.image == YesImage14)
        img.image = YesImage14;
    else
        img.image = YesImage14;

}
- (IBAction)startClick4:(id)sender{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.2];
    [switchView setAlpha:0];
    [UIView commitAnimations];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
    sound5=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"arrowhitting" ofType:@"wav"]] error:NULL];
    animationTimer4 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick4) userInfo:nil repeats:NO];

    img.animationImages = [NSArray arrayWithObjects:

                              [UIImage imageNamed: @"imgarrow0001.png"],
                              [UIImage imageNamed: @"imgarrow0002.png"],
                              [UIImage imageNamed: @"imgarrow0003.png"],
                              [UIImage imageNamed: @"imgarrow0004.png"],
                              [UIImage imageNamed: @"imgarrow0005.png"],
                              [UIImage imageNamed: @"imgarrow0006.png"],
                              [UIImage imageNamed: @"imgarrow0007.png"],
                              [UIImage imageNamed: @"imgarrow0008.png"],
                              [UIImage imageNamed: @"imgarrow0009.png"],
                              [UIImage imageNamed: @"imgarrow0010.png"],
                              [UIImage imageNamed: @"imgarrow0011.png"],
                              [UIImage imageNamed: @"imgarrow0012.png"],
                              [UIImage imageNamed: @"imgarrow0013.png"],
                              [UIImage imageNamed: @"imgarrow0014.png"],
                              [UIImage imageNamed: @"imgarrow0015.png"],
                              [UIImage imageNamed: @"imgarrow0016.png"],
                              [UIImage imageNamed: @"imgarrow0017.png"],
                              [UIImage imageNamed: @"imgarrow0018.png"],
                              [UIImage imageNamed: @"imgarrow0019.png"],
                              [UIImage imageNamed: @"imgarrow0020.png"],
                              [UIImage imageNamed: @"imgarrow0021.png"],
                              [UIImage imageNamed: @"imgarrow0022.png"],
                              [UIImage imageNamed: @"imgarrow0023.png"],
                              [UIImage imageNamed: @"imgarrow0024.png"],nil];

    [img setAnimationRepeatCount:1];
    img.animationDuration =.7;
    [img startAnimating];
    [sound5 play];
}
- (void)tick4{
    [self animateYes4];
}
- (void)animateYes4{

    UIImage *YesImage15=[UIImage imageNamed:@"imgarrow0024.png"];

    if(img.image == YesImage15)
        img.image = YesImage15;
    else
        img.image = YesImage15;

}
- (IBAction)startClick5:(id)sender{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [switchView setAlpha:0];
    [UIView commitAnimations];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
    sound6=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"imgquote1" ofType:@"wav"]] error:NULL];
    animationTimer5 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick5) userInfo:nil repeats:NO];

    img.animationImages = [NSArray arrayWithObjects:
                              [UIImage imageNamed: @"qotebandb0000.png"],
                              [UIImage imageNamed: @"qotebandb0001.png"],
                              [UIImage imageNamed: @"qotebandb0002.png"],
                              [UIImage imageNamed: @"qotebandb0003.png"],
                              [UIImage imageNamed: @"qotebandb0004.png"],
                              [UIImage imageNamed: @"qotebandb0005.png"],
                              [UIImage imageNamed: @"qotebandb0006.png"],
                              [UIImage imageNamed: @"qotebandb0007.png"],
                              [UIImage imageNamed: @"qotebandb0008.png"],
                              [UIImage imageNamed: @"qotebandb0009.png"],
                              [UIImage imageNamed: @"qotebandb0010.png"],
                              [UIImage imageNamed: @"qotebandb0011.png"],
                              [UIImage imageNamed: @"qotebandb0012.png"],
                              [UIImage imageNamed: @"qotebandb0013.png"],
                              [UIImage imageNamed: @"qotebandb0014.png"],
                              [UIImage imageNamed: @"qotebandb0015.png"],
                              [UIImage imageNamed: @"qotebandb0016.png"],
                              [UIImage imageNamed: @"qotebandb0017.png"],
                              [UIImage imageNamed: @"qotebandb0018.png"],
                              [UIImage imageNamed: @"qotebandb0019.png"],
                              [UIImage imageNamed: @"qotebandb0020.png"],
                              [UIImage imageNamed: @"qotebandb0021.png"],
                              [UIImage imageNamed: @"qotebandb0022.png"],
                              [UIImage imageNamed: @"qotebandb0023.png"],
                              [UIImage imageNamed: @"qotebandb0024.png"],
                              [UIImage imageNamed: @"qotebandb0025.png"],
                              [UIImage imageNamed: @"qotebandb0026.png"],
                              [UIImage imageNamed: @"qotebandb0027.png"],
                              [UIImage imageNamed: @"qotebandb0028.png"],
                              [UIImage imageNamed: @"qotebandb0029.png"],
                              [UIImage imageNamed: @"qotebandb0030.png"],
                              [UIImage imageNamed: @"qotebandb0031.png"],
                              [UIImage imageNamed: @"qotebandb0032.png"],
                              [UIImage imageNamed: @"qotebandb0033.png"],
                              [UIImage imageNamed: @"qotebandb0034.png"],
                              [UIImage imageNamed: @"qotebandb0035.png"],
                              [UIImage imageNamed: @"qotebandb0036.png"],
                              [UIImage imageNamed: @"qotebandb0037.png"],
                              [UIImage imageNamed: @"qotebandb0038.png"],nil];

    [img setAnimationRepeatCount:1];
    img.animationDuration =3.1;
    [img startAnimating];
    [sound6 play];
}
- (void)tick5{
    [self animateYes5];
}
- (void)animateYes5{

    UIImage *YesImage17=[UIImage imageNamed:@"qotebandb0038.png"];

    if(img.image == YesImage17)
        img.image = YesImage17;
    else
        img.image = YesImage17;

}
- (IBAction)startClick6:(id)sender{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [switchView setAlpha:0];
    [UIView commitAnimations];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [myScrollView1 setAlpha: 0];
    [UIView commitAnimations];
    sound7=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"audiop" ofType:@"wav"]] error:NULL];
    animationTimer6 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick6) userInfo:nil repeats:NO];

    img.animationImages = [NSArray arrayWithObjects:
                              [UIImage imageNamed: @"hammer0001.png"],
                              [UIImage imageNamed: @"hammer0002.png"],
                              [UIImage imageNamed: @"hammer0003.png"],
                              [UIImage imageNamed: @"hammer0004.png"],
                              [UIImage imageNamed: @"hammer0005.png"],
                              [UIImage imageNamed: @"hammer0006.png"],
                              [UIImage imageNamed: @"hammer0007.png"],
                              [UIImage imageNamed: @"hammer0008.png"],
                              [UIImage imageNamed: @"hammer0009.png"],
                              [UIImage imageNamed: @"hammer0010.png"],
                              [UIImage imageNamed: @"hammer0011.png"],
                              [UIImage imageNamed: @"hammer0012.png"],
                              [UIImage imageNamed: @"hammer0013.png"],
                              [UIImage imageNamed: @"hammer0014.png"],
                              [UIImage imageNamed: @"hammer0015.png"],
                              [UIImage imageNamed: @"hammer0016.png"],
                              [UIImage imageNamed: @"hammer0017.png"],
                              [UIImage imageNamed: @"hammer0018.png"],
                              [UIImage imageNamed: @"hammer0019.png"],
                              [UIImage imageNamed: @"hammer0020.png"],
                              [UIImage imageNamed: @"hammer0021.png"],
                              [UIImage imageNamed: @"hammer0022.png"],
                              [UIImage imageNamed: @"hammer0023.png"],
                              [UIImage imageNamed: @"hammer0024.png"],
                              [UIImage imageNamed: @"hammer0025.png"],
                              [UIImage imageNamed: @"hammer0026.png"],
                              [UIImage imageNamed: @"hammer0027.png"],
                              [UIImage imageNamed: @"hammer0028.png"],
                              [UIImage imageNamed: @"hammer0029.png"],
                              [UIImage imageNamed: @"hammer0030.png"],
                              [UIImage imageNamed: @"hammer0031.png"],
                              [UIImage imageNamed: @"hammer0032.png"],
                              [UIImage imageNamed: @"hammer0033.png"],
                              [UIImage imageNamed: @"hammer0034.png"],nil];

    [img setAnimationRepeatCount:1];
    img.animationDuration =2.25;
    [img startAnimating];
    [sound7 play];
}
- (void)tick6{
    [self animateYes6];
}
- (void)animateYes6{

    UIImage *YesImage18=[UIImage imageNamed:@"img.png"];

    if(img.image == YesImage18)
        img.image = YesImage18;
    else
        img.image = YesImage18;

}

- (void)stopTimer
{
    [animationTimer invalidate];
    [animationTimer release];
    [animationTimer1 invalidate];
    [animationTimer1 release];
    [animationTimer2 invalidate];
    [animationTimer2 release];
    [animationTimer3 invalidate];
    [animationTimer3 release];
    [blinkTimer invalidate];
    [blinkTimer release];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint location = [touch locationInView:touch.view];
    img.center = location; 
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

// Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data

- (void)dealloc {
    [super dealloc];
    [img release];
    [sound1 release];
    [sound2 release];
    [sound3 release];
    [sound4 release];
    [sound5 release];
    [sound6 release];
    [sound7 release];
}
@end

Nur zur Klarstellung: Die Timer werden verwendet, um das letzte Bild jeder einzelnen Animation auf das Bild der imageView zu setzen.

3voto

e.James Punkte 112528

Ich kann ein potenzielles Speicherleck in Ihrem Code sehen, wo Sie die AVAudioPlayer Objekte:

sound1=[[AVAudioPlayer alloc] initWithContentsOfURL:...

Aus Ihrem Code kann ich ersehen, dass die sound# Variablen sind Instanzvariablen, die Sie pflichtgemäß in Ihrem -(void)dealloc Methode. Das Leck würde jedoch auftreten, wenn Sie diese bestimmte Aktion mehr als einmal während der Lebensdauer der Klasse initiieren. Jedes Mal, wenn die Aktion ausgelöst wird, sound1 bekommt ein brandneues AVAudioPlayer Objekt und verliert prompt den Verweis auf das alte Objekt.

Ich würde vorschlagen, das Folgende hinzuzufügen:

[sound1 release];
sound1 = [[AVAudioPlayer alloc] initWithContentsOfUrl: ...

Und stellen Sie sicher, dass Sie es einstellen:

sound1 = nil;

In Ihrem -(id)init Methode, so dass der erste Aufruf von [sound1 release] verursacht keine Probleme.

aktualisieren:

Die Faustregel zur Vermeidung von Speicherlecks lautet: Wann immer Sie alloc , copy , oder retain ein Objekt, müssen Sie auch release es.

Sollten Sie sich Sorgen machen, dass hier und da ein paar KB durchgesickert sind? Ich würde sagen, ja. Wenn Ihnen Ihre Arbeit am Herzen liegt, sollten Sie sich bemühen, sie so gut wie möglich zu machen. Ich will damit nicht sagen, dass Sie niemals Code freigeben, der ein kleines Speicherleck aufweist. Ich will damit sagen, dass kleine Speicherlecks als Fehler betrachtet werden sollten. Sie sollten in Ihrer Liste der "zu behebenden Probleme" auftauchen und Sie sollten daran arbeiten, sie so schnell wie möglich zu beseitigen.

Antwort auf den Kommentar:

Ihr 00001111ViewController Klasse sollte eine Methode namens -(id)init :

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }

    sound1 = nil;
    sound2 = nil;
    //...

    return self;
}

Der Code innerhalb der init Methode wird ausgeführt, wenn eine Instanz Ihrer Klasse erstellt wird, ähnlich wie der Code in der dealloc Methode wird aufgerufen, wenn eine Instanz Ihrer Klasse zerstört wird. Beachten Sie, dass wenn Ihre Oberklasse (die Klasse, die 00001111ViewController erbt von) einen anderen designierten Initialisierer verwendet, sollten Sie stattdessen diesen Methodennamen verwenden. In der Cocoa-Welt beginnen die Initialisierungen immer mit init aber sie können weitere Argumente anführen, wie z. B. initWithNibName:bundle: o initWithContentsOfFile: .

ein weiteres Update:

Nach längerem Nachdenken wäre es vielleicht besser, die AVAudioPlayer Objekte nur einmal, in Ihrem viewDidLoad Methode.

- (void)viewDidLoad
{
    blinkTimer = [NSTimer ...
    [blinkTimer setFireDate: ...

    sound1 = [[AVAudioPlayer alloc] initWithContentsOfUrl: ...
    sound2 = [[AVAudioPlayer alloc] initWithContentsOfUrl: ...
    sound3 = [[AVAudioPlayer alloc] initWithContentsOfUrl: ...
}

Damit müssten Sie sie nicht mehr jedes Mal neu in Ihrem startClick Methoden. Alles, was Sie tun müssten, wäre der Aufruf von [sound1 play] am Ende dieser Methoden, und alles wäre gut.

1voto

Ken Pespisa Punkte 21474

Im Idealfall haben Sie keine Speicherlecks. Sie können es aber auch so sehen: Wenn bei jedem Klick nur ein paar KB verloren gehen und es nicht viele Klicks geben wird, dann ist das kaum ein Problem. Ich habe gesehen, wie Instrumente Speicherverluste bei Code gemeldet haben, der nicht von mir stammt (also Framework-Code), und es waren nur ein paar KB, und es passierte nur sehr sporadisch, also habe ich beschlossen, dass es in Ordnung ist. Es ist keine gute Praxis, aber Stunden damit zu verschwenden, ein Leck aufzuspüren, das man sowieso nicht beheben kann, ist auch keine gute Zeitverwendung.

Wenn Sie also sicher sein können, dass das Leck nicht außer Kontrolle gerät, können Sie es vielleicht dort lassen. Wenn dieses Leck jedoch viele Dutzend oder Hunderte Male auftritt und sich zu Hunderten von KBs summiert, könnten Sie schnell in Schwierigkeiten geraten. Ihre Ressourcen sind auf dem iPhone begrenzt, und Lecks sind der Hauptgrund für den Absturz von iPhone-Anwendungen.

Um Ihnen bei Ihrem Code zu helfen, finde ich das Tool Clang Static Analyzer sehr nützlich. Es gibt eine grafische Benutzeroberfläche für das Tool aquí . Es erstellt einen Bericht über Lecks und andere Bereiche, die in Ihrem Code überprüft werden müssen.

EINE MEHRHEIT: Die allgemeine Regel der Speicherverwaltung in Objective-C ist, wenn Sie ein Objekt zuweisen, kopieren oder behalten, müssen Sie es freigeben. Ansonsten lassen Sie es in Ruhe. Die meisten Lecks können behoben werden, indem Sie jede Stelle finden, an der Sie Code wie [[MyObject alloc] init] haben und sicherstellen, dass Sie [MyObject release] irgendwann danach aufrufen.

1voto

rgcb Punkte 1091

Ich bin neu in das iPhone SDK zu (und gc-less-Programmierung im Allgemeinen); Ich habe Clang/LLVM sehr nützlich gefunden ... hier ist die Anleitung, die ich verwendet:

http://www.oiledmachine.com/posts/2009/01/06/using-the-llvm-clang-static-analyzer-for-iphone-apps.html

0voto

nasmorn Punkte 2100

Für den Anfang könnten Sie die NSArrays erstellen, die die Bilder in der init Methode

Und dann könnten Sie darüber nachdenken, ob Sie ein Muster für das Einfügen der Bilder finden. Erstellen Sie eine Funktion, die eine Schleife durchläuft und den Pfad als Argument nimmt, der die Bilder in das Array einfügt.

0voto

Jared Oberhaus Punkte 14325

Die erste Antwort verweist auf einen statischen Analyzer, dessen Verwendung definitiv sinnvoll ist. Eine weitere gute Sache ist ein dynamischer Analyzer, der Zuweisungen/Entzugaben und Speicherzugriffe zur Laufzeit beobachtet. Valgrind ist ein beliebter Open-Source-Dynamik-Analysator, der häufig unter Linux eingesetzt wird.

Valgrind kann unter OSX funktionieren (obwohl es dort heißt, dass es "nicht unterstützt wird und unvollständig und fehlerhaft ist"), und mit ein wenig Hacking hat es jemand zum Laufen gebracht unter Ausführbare iPhone SDK-Dateien .

Noch besser ist es, wenn Sie Instruments ausprobieren, das Teil von XCode ist. Es gibt eine Anleitung zum Ausführen von Instruments aquí .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X