2015-11-28 9 views
9

Ich arbeite an einem Kartenspiel in Swift 2.1 mit Xcode 7 und meine App läuft gut im Simulator, stürzt aber ab, wenn ich es auf meinem Gerät teste .Xcode 7/Swift 2.1 "Nachricht vom Debugger: Beendet wegen Speicherproblem"

Mit Breakpoints habe ich den Absturz auf eine NSTimer.scheduledTimerWithTimeInterval Methode lokalisiert, die nach einer Animation ausgeführt wird (und dann eine andere Animation auslöst).

Ich dachte, vielleicht war es die Größe meiner Bilder, da einige ziemlich groß waren (> 4 MB), also komprimierte ich alle Bilder in der Animation, und insgesamt nehmen sie jetzt weniger als 1 MB auf.

Ich habe auch die Zombie und Leak-Tools ausgeführt und nichts gefunden, also bin ich etwas perplex. Hier ist der Code, wo es abstürzt.

func animateOnDeal() { 
    self.playerAnimatedCard.hidden = false 
    self.dealerAnimatedCard.hidden = true 
    cardOneToDeal() 
} 

func cardOneToDeal() { 
    UIView.animateWithDuration(0.5, animations: { 
     self.playerAnimatedCard.center.x -= self.view.bounds.width 
     }, completion: {finished in self.flipCardOne()}) 
} 

func flipCardOne() { 
    self.playerAnimatedCard.playFlipAnimation() 
    NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: "cardTwoToDeal", userInfo: nil, repeats: false) 
} 

Und hier ist der Code, der tatsächlich die Animation läuft (in einer UIImageView-Unterklasse):

func playFlipAnimation() { 
    self.image = UIImage(named: "cardback2.png") 
    self.animationImages = nil 
    var imgArray = [UIImage]() 

    for var x = 1; x <= 12; x++ { 
     let img = UIImage(named: "img\(x).png") 
     imgArray.append(img!) 
    } 

    self.animationImages = imgArray 
    self.animationDuration = 0.3 
    self.animationRepeatCount = 1 
    self.startAnimating() 

Als Randbemerkung, der Debugger einfach erklärt: „Nachricht von Debugger: Abgebrochen wegen Speicherproblem . "

Jede Hilfe würde sehr geschätzt, bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Vielen Dank!

EDIT:

Also, um es etwas mehr zu testen, habe ich geändert func playFlipAnimation iterieren und mit 5 Bilder anstelle des Originals 12. Diese den Absturz gelöst zu haben scheint, aber ich bin immer noch unsicher warum mehr Bilder die Anwendung in erster Linie zum Absturz bringen.

+5

Die Beendigung aufgrund eines Speicherproblems ist nicht unbedingt ein Hinweis auf ein Leck. Wenn Sie dies noch nicht getan haben, würde ich Ihnen empfehlen, ein Profiling mit dem Zuordnungsinstrument durchzuführen, um genau zu sehen, wo Ihr Speicherwachstum stattfindet. Stellen Sie sicher, dass Sie die Option "Referenzwerte aufzeichnen" aktivieren, und notieren Sie die Anzahl der persistenten Objekte, wenn Sie Ihre App auf dem Gerät ausführen. Es gibt eine Reihe von Tutorials online über das Allocations-Instrument, aber lassen Sie mich wissen, wenn Sie zusätzliche Anleitung hier benötigen. –

+0

@DerekLee, danke für den Hinweis! Also habe ich das Allocations-Instrument ausgeführt und mehrere Flags mit dem Titel "Eine Objective-C-Nachricht wurde an ein invalides Objekt 'IDEActivityReport' unter der Adresse: 0x7fc5dda8bbf0 gesendet." Ich habe versucht, nach dieser Nachricht zu suchen, habe aber nichts Substanzielles gefunden. Irgendeine Idee, was könnte es verursachen? – rdespoiu

+0

@DerekLee Also, um es mehr zu testen, habe ich func playFlipAnimation geändert, um zu iterieren und 5 Bilder anstelle der ursprünglichen 12 hinzuzufügen. Dies scheint den Absturz gelöst zu haben, aber ich bin immer noch unsicher, warum mehr Bilder haben Absturz der Anwendung an erster Stelle. – rdespoiu

Antwort

1

Ein paar Punkte:

  1. Als Derek Lee hat bereits darauf hingewiesen, Bilder können sehr speicherintensiv sein. Meiner Erfahrung nach speichert die Runtime auch Bilder, die nach der Verwendung für einen bestimmten Zeitraum im Hintergrund zwischengespeichert werden. Dies könnte für Ihre Situation relevant sein, denn wenn Sie Ihren Code betrachten, laden Sie jedes Mal, wenn die Animation aufgerufen wird, einen neuen Satz von zwölf Bildern. Wenn Sie diese Animation häufig wiederholen, ergibt sich schnell eine Menge Speicher, besonders bei Bilddateien mit 1 MB. In diesem Fall mag es in der kurzen Zeit zwar ineffizient erscheinen, aber vielleicht möchten Sie ein Array von Bildern initialisieren, wenn die Klasse initialisiert wird, was Sie wiederverwenden können.

  2. Eine Sache, die Sie tun können, wenn Sie über eine Schleife iterieren, von der Sie wissen, dass sie speicherintensiv ist, legen Sie sie in einen Autorespulepool. Siehe die Entwicklerreferenz unter: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html Ich weiß, dass technisch ARC alles sein sollte, was Sie in der modernen iOS-Welt brauchen, aber das funktionierte für mich, als ich eine sehr datenintensive Prozedur in einer meiner Apps erstellte.

  3. Es ist unwahrscheinlich, dass Sie jemals eine Speicherwarnung auslösen, die in Simulator ausgeführt wird, da nicht berücksichtigt wird, dass die zugrunde liegende Hardware wesentlich mehr Kapazität als das Zielgerät zur Verfügung hat. In meiner unendlichen Weisheit habe ich mal etwas laufen lassen, was am Ende 50 GB Speicher verbraucht hat, aber das hat keine Art von Warnungen auf Simulator ausgelöst!

  4. Nebenbei würde ich denken, dass Sie in der Lage sein sollten, Ihre Kartenbilder auf weit weniger als 1 MB zu komprimieren. Natürlich hängt das davon ab, welche Art von Bild Sie verwenden möchten (sind das Fotos?), Aber wenn es ein einfaches .png ist, dann scheint mir das ziemlich groß zu sein.

Hoffe, dass hilft.

2

Ich traf das gleiche Problem und stellte fest, es war das Problem, das ich überprüft Zombie-Objekte in dem Schema aktivieren. Sie können es also auch überprüfen. enter image description here

+0

Ich habe das gleiche gemacht ... Aber immer noch vor dem Problem nach dem Speichern von 15 Bildern von Sqlite db. –