2009-05-27 7 views
0

Ich arbeite an einem einfachen Proof-of-Concept für eine iPhone App (und wichtige Informationen, ich bin ziemlich neu in der Entwicklung von Mac OSX). Ich habe eine Ansicht-basierte App mit einem Timer erstellt. Ich habe meinen NSTimer in der Schnittstelle des Controllers meiner App deklariert, @property und @synthesize verwendet und initialisiere ihn in der viewDidLoad-Methode des Controllers mit der Methode "planedTimerWithTimeInterval". Mein Selektor ist eine Methode mit der Signatur -(void)someMethod:(NSTimer *)timer, die in der Schnittstelle deklariert ist und auch in der Implementierungsdatei des Controllers definiert ist. Ich kann über die Zeile hinausgehen, wo ich den Timer einstelle und sehe, dass er auf ein gültiges Objekt zeigt, aber mein Programm geht nicht weiter als das Ende der viewDidLoad Methode und erreicht niemals den Breakpoint in der ersten Zeile meiner Methode, die von aufgerufen wird der Timer. Ich sehe auch GDB: Program received bad signal: "EXC_BAD_ACCESS" in der Statusleiste von xcode an diesem Punkt (ViewDidLoad Ende ist erreicht). Ich habe in IB nichts gemacht, aber eine Ansicht und eine Auswahl hinzugefügt, nur damit ich sehen kann, ob die Benutzeroberfläche tatsächlich geladen wird ... tut es nie.Benutzt ich NSTimer korrekt in der iPhone View-basierten App?

Also, mache ich etwas falsch mit dem NSTimer, oder sind meine Probleme anderswo? Wie kann ich die Debugging-Tools in xcode verwenden, um mehr Informationen zu erhalten?

+2

Können Sie einen Code schreiben? Sie übergeben den falschen Selektor wahrscheinlich an den NSTimer oder verwenden @selector nicht. –

+0

Der Stapel ist auch das nützlichste Werkzeug, um ein EXC_BAD_ACCESS zu verstehen (was für "ein ungültiger Zeiger gejagt" ist). In welcher Codezeile warst du, als du abgestürzt bist? Wenn du damals in einem Rahmen warst, was hat es getan? –

+0

Sieht aus wie Sie fogot ":" beim Erstellen von Selektor Es muss sein: [NSTimer terminatedTimerWithTimeInterval: 1 target: self-Selektor: @selector (someMethod :) userInfo: keine Wiederholungen: YES]; – oxigen

Antwort

3

EXC_BAD_ACCESS weist normalerweise auf einen Speicherverwaltungsfehler hin, ohne dass der Code wahrscheinlich irgendwo anders in Ihrer App angezeigt wird. Es ist ein sehr häufiger Fehler für Anfänger, aber ein wichtiges Thema, um es vollständig zu verstehen. Daher würde ich vorschlagen, einige der Fragen zur Speicherverwaltung hier durchzulesen und ein paar Leitfäden oder Tutorials zu finden, um durchzusehen. Es ist eigentlich ziemlich einfach zu lernen.

Es sollte auch nicht schaden, aber wenn Sie nicht zwischendurch auf den Timer zugreifen müssen, müssen Sie ihn nicht als Instanzvariable speichern. Sobald Sie einen Timer erstellt und gestartet haben, wird er zur Run-Schleife der Anwendung hinzugefügt und von dieser beibehalten.

+0

Danke. Ich habe alles andere außer dem Timer und ein paar sehr einfachen Codes in meinem Timer-Selektor entfernt, und alles funktioniert und alle Breakpoints werden getroffen. Das Problem ist in der Tat an anderer Stelle in dieser Methode und ich bin sicher, es hat mit Speichermgmt zu tun, wie Sie vorgeschlagen haben. – Rich

2

Haben Sie NSZombieEnabled?

Kann nützlich sein, wenn dies bei einem überfreigegebenen Objekt fehlschlägt.

+1

Dies ist ein sehr guter Ratschlag. NSZbomieEnabled war sehr nützlich für mich, zusammen mit Clang. – freespace

Verwandte Themen