2017-09-24 4 views
1

Ich versuche eine einfache Anwendung zu erstellen, in der der Benutzer Notizen durchgehen und dann ein Quiz machen kann. Ich präsentiere diese Notizen als Bilder und das Bild würde einem UIImageView zugewiesen werden, um dem Benutzer gezeigt zu werden.Speicherverlust beim Drücken der Taste

Meiner Ansicht nach geladen habe ich meistens die Benutzeroberfläche einstellen. Dann würde ich mein Array erschaffen meine Anordnung von Bildern (Noten), die

- (void)viewDidLoad { 
    UIColor *colourForNavigationBar = [self colorWithHexString:@"919D9F"]; 
    [[UINavigationBar appearance] setBarTintColor:colourForNavigationBar]; 
    UIColor *colourForBackground = [self colorWithHexString:@"F0F3F4"]; 
    self.view.backgroundColor = colourForBackground; 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; 
    label.backgroundColor = [UIColor clearColor]; 
    label.font = [UIFont boldSystemFontOfSize:27.0]; 
    label.textAlignment = NSTextAlignmentCenter; 
    label.textColor = [UIColor whiteColor]; 
    self.navigationItem.titleView = label; 
    label.text = @"Notes"; 
    [label sizeToFit]; 
    UIColor *colourForButton = [self colorWithHexString:@"919D9F"]; 
    self.previousButton.backgroundColor = colourForButton; 
    self.nextButton.backgroundColor = colourForButton; 
    finishedNotes = NO; 
    playerPlaying = NO; 
    arrayOfImages = [NSArray arrayWithObjects: 
        [UIImage imageNamed:@"1.png"], 
        [UIImage imageNamed:@"2.png"], 
        [UIImage imageNamed:@"3.png"], 
        [UIImage imageNamed:@"4.png"], 
        [UIImage imageNamed:@"5.png"], 
        [UIImage imageNamed:@"6.png"], 
        [UIImage imageNamed:@"7.png"], 
        [UIImage imageNamed:@"8.png"], 
        [UIImage imageNamed:@"9.png"], 
        [UIImage imageNamed:@"10.png"], 
        [UIImage imageNamed:@"11.png"], 
        [UIImage imageNamed:@"12.png"], 
        [UIImage imageNamed:@"13.png"], 
        nil]; 
} 

Dann gibt es die Schaltfläche ‚Weiter‘, die der Benutzer zur nächsten Note zu weiter ermöglicht. Unten ist der Code für die Aktion

- (IBAction)nextNote:(id)sender { 
    if (finishedNotes == YES) { 
     [self performSegueWithIdentifier:@"quizFromNotes" sender:self]; 
    } 
    self.previousButton.enabled = YES; 
    stateOfPhoto++; 
    if (stateOfPhoto < 13) { 
     UIImage *image = [arrayOfImages objectAtIndex:stateOfPhoto-1]; 
     self.imageView.image = image; 
    } 
    if (stateOfPhoto == 13) { 
     UIImage *image = [arrayOfImages objectAtIndex:stateOfPhoto-1]; 
     self.imageView.image = image; 
     [self.nextButton setTitle:@"Begin Quiz" forState:UIControlStateNormal]; 
     finishedNotes =YES; 
    } 
    if (playerPlaying == YES) { 
     [self.notesPlayer stop]; 
     playerPlaying = NO; 
    } 
} 

Alles funktioniert gut und reibungslos. Wenn jedoch die Bildänderung erfolgt, nimmt der von der Anwendung verwendete Speicher um einige Megabyte zu. Unten ist das Foto der Speicherbelegung.

Memory Usage Recorded

Von der schwarzen Linie an, als ich die ‚next‘ Taste drücken, verwendet der Speicher erhöht. Es wiederholt sich nur, bis der Benutzer das Quiz fortgesetzt hat. Wenn ich das Quiz beende und die Notizen überspringe, steigt die Speichernutzung von der vorherigen Speichernutzung (73 mb) weiter an. Irgendwann würde die App abstürzen und ich kann die App nicht mehr starten.

Ich habe noch nie Speicherverlust Probleme konfrontiert und daher bin ich mir nicht sicher, was zu tun ist. Ich habe die letzte Stunde gegoogelt und bin nicht in der Lage, eine Lösung dafür zu finden. Meine Frage ist also, wie ich den Speicher freigeben oder die Speichernutzung reduzieren könnte.

Antwort

0

Ich denke, es ist wegen Ihrer Bilder, wie groß sind die Bilder, die Sie zeigen?

zu dieser Antwort Basierend: https://stackoverflow.com/a/22662754/3231194, können Sie entweder diese Methode verwenden, um Ihre Bilder zu skalieren, bevor sie in Ihre UIImageView setzen:

-(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { 
    //UIGraphicsBeginImageContext(newSize); 
    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution). 
    // Pass 1.0 to force exact pixel size. 
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

Aber das wird allerdings eine CPU-Auslastung (ich bin nicht sicher, nehmen wenn es eine große Sache ist).

ODER

Sie können Ihre Bilder selbst nur die Größe, bevor sie zu Ihrem Xcode-Projekt zu importieren.

+1

Vielen Dank. Ich habe versucht, das Bild manuell zu vergrößern, aber es hat nicht funktioniert, aber das Skalieren des Bildes hat dazu beigetragen, die Speicherauslastung zu reduzieren. Danke für diese Antwort und Entschuldigung für die verspätete Antwort. –

Verwandte Themen