Sto lavorando a un gioco di carte in Swift 2.1 usando Xcode 7 e la mia app funziona correttamente nel simulatore ma si blocca quando la provo sul mio dispositivo .Xcode 7/Swift 2.1 "Messaggio dal debugger: terminato a causa di un problema di memoria"
Utilizzando i punti di interruzione, ho individuato l'arresto anomalo in un metodo NSTimer.scheduledTimerWithTimeInterval
che viene eseguito dopo che si è verificata un'animazione (e quindi attiva un'altra animazione).
Ho pensato che forse era la dimensione delle mie immagini, in quanto alcune erano piuttosto grandi (> 4 MB), quindi ho compresso tutte le immagini nell'animazione, e in totale ora occupano meno di 1 MB.
Ho anche eseguito gli strumenti Zombie and Leak e non ho trovato nulla, quindi sono un po 'perplesso. Ecco il codice dove si blocca.
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)
}
Ed ecco il codice che esegue effettivamente l'animazione (in una sottoclasse UIImageView):
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()
Come nota a margine, il debugger afferma semplicemente: "Messaggio da debugger: terminato a causa di problema di memoria ".
Qualsiasi aiuto sarebbe molto apprezzato, per favore fatemi sapere se avete bisogno di ulteriori informazioni. Grazie!
EDIT:
Quindi, al fine di verificare il lavoro svolto ancora un po ', ho cambiato func playFlipAnimation per iterare ed aggiungere 5 immagini al posto degli originali 12. Questo sembra aver risolto l'incidente, ma io sono ancora incerti sul perché avere più immagini sta bloccando l'applicazione in primo luogo.
In fase di chiusura a causa di un problema di memoria non è necessariamente un'indicazione di una perdita. Se non lo hai già fatto, ti consiglio di fare un po 'di profilazione usando lo strumento Allocations per vedere esattamente dove sta avvenendo la tua crescita di memoria. Assicurati di spuntare "Record referti di riferimento" e prendi nota del numero di oggetti persistenti durante l'esecuzione della tua app sul dispositivo. Esistono numerosi tutorial online sullo strumento Allocations ma fammi sapere se hai bisogno di ulteriori indicazioni qui. –
@DerekLee, grazie per il consiglio! Così ho eseguito lo strumento Allocations e ricevuto numerosi flag dal titolo "Un messaggio Objective-C è stato inviato a un oggetto" IDEActivityReport "non valido all'indirizzo all'indirizzo: 0x7fc5dda8bbf0." Ho provato a cercare questo messaggio ma non ho trovato nulla di sostanziale. Qualche idea su cosa potrebbe causarlo? – rdespoiu
@DerekLee Quindi, per testarlo ancora, ho cambiato func playFlipAnimation per iterare e aggiungere 5 immagini invece dell'originale 12. Questo sembra aver risolto il crash, ma non sono ancora sicuro del motivo per cui avere più immagini è arresto anomalo dell'applicazione in primo luogo. – rdespoiu