Frage

Ich bin ein lange Zeit Microsoft-Entwickler und ich bin neu auf iPhone Entwicklung mit Xcode. Also, ich lese ein Buch und gehe durch Beispiele versucht, mich zu lehren, wie eine iPhone-Anwendung zu schreiben, Objective-C verwenden. Alle bisher gut gewesen, aber einmal in eine Weile ich laufe in die generische ‚objc_exception_throw‘ Nachricht zur Laufzeit. Wenn dies geschieht, ist die Quelle dieser Ausnahme sehr schwer zu finden. Nach einigem Versuch und Irrtum fand ich meine Antwort. Einer der Parameter falsch geschrieben wurde.

Wie Sie unten sehen können, falsch geschriebene ich den Parameter ‚otherButtonTitles‘ durch die zweite ‚t‘ Weglassen in Taste.

UIAlertView *alert = [[UIAlertView alloc] 
                      initWithTitle:@"Date and Time Selected" 
                      message:message 
                      delegate:nil
                      cancelButtonTitle:@"Cancel"
                      otherButonTitles:nil];

Der Grund, diese mir Zeit nahm zu finden, ist, dass der Code erfolgreich aufgebaut. Ist das ein normales Verhalten für die Objective-C-Compiler? Ich bin es gewohnt, in den .NET-Compiler der Build fehlschlagen zu haben, wenn ich einen gemeinsamen Syntaxfehler wie diese mache. Gibt es eine Compiler-Einstellung kann ich die eingebauten machen ändern fehlschlagen, wenn ich diese Fehler machen?

War es hilfreich?

Lösung

In erster Linie offen ~/.gdbinit (das ist die Datei .gdbinit in Ihrem Home-Verzeichnis genannt - ja, mit einem Punkt beginnt) und setzen diese in ihm:

fb -[NSException raise]
fb objc_exception_throw
fb malloc_error_break

Das wird GDB initialisieren mit drei Standard-Haltepunkte, wenn sie auftreten, GDB Ihre Anwendung stoppen und zeigen Ihnen den Stack-Trace. Dies ist sehr gut mit Xcode integriert, so dass Sie der Lage sein werden schön durch den Code zu gehen, indem Sie Stapel Spurenelemente, sobald eine Ausnahme irgendwo auftritt oder ein malloc fehlschlägt.

Öffnen Sie dann die Get Info Panel an Ihrem Projekt (oder wählen Sie Ihr Projekt (oben Artikel im Groups & Files) und traf cmd-i), gehen Sie auf die Registerkarte Build und stellen Sie Ihr Projekt Base SDK Device - iPhone OS [someversion]. Blättern Sie den ganzen Weg nach unten und die GCC 4.0 - Warnings Bereich. Dort; Schalten Sie so viele Warnungen wie Sie sich wohl fühlen, aber stellen Sie sicher auf Treat Warnings as Errors drehen (das ist das Äquivalent von GCC_TREAT_WARNINGS_AS_ERRORS). Persönlich habe ich es diesen Satz:


(Quelle: lyndir.com )

Sie sollten nun bekommen Compiler-Warnungen für die meisten Dinge, die Sie in Code und dem Compiler falsch machen lassen nicht Sie den Code ausführen, bis Sie sie reparieren. Wenn die Dinge hinter der Nase des Compilers zu tun, sollten Sie in der Lage sein, das Problem zu finden, leicht mit GDB an einer geeigneten Stelle zu brechen.

Sie sollten auch in NSZombie* aussehen. Dies sind Umgebungsvariablen, die für die frühen Bruch auf schlechte Speicherzuweisung oder Zugriffs Situationen sehr praktisch sind. Zum Beispiel; wih NSZombieEnabled nichts wirklich gelöst werden; auf dealloc werde es mit _NSZombie überschrieben und sollten Sie versuchen, wieder dieses dealloced Speicher zuzugreifen (ein dealloced Zeiger Dereferenzierung) Sie etwas zu brechen auf in GDB, statt der Anruf durchlaufen wie normale bekommen, nur zufällig ausgegeben werden Daten (die, natürlich, ist nicht das, was man wollte). Für weitere Informationen siehe hierzu http://www.cocoadev.com/index.pl?NSZombieEnabled .

Andere Tipps

Sie immer die -Werror GCC Einstellung verwenden (GCC_TREAT_WARNINGS_AS_ERRORS = YES). Sie sollten niemals Warnungen in Ihrem Code haben, und dies ist ein Beispiel, wo die Warnung ein kritischer Fehler ist.

Auch, wenn Sie einen objc_exception_throw bekommen, wechseln Sie in die Konsole (Befehl-Umschalt-R) und suchen Sie nach der ersten „low“ Nummer-Adresse.

2009-04-01 13:25:43.385 CrashExample[41720:20b] Stack: (
    2528013804,
    2478503148,
    2528036920,
    2528053460,
    2358032430,
    11076,
    11880,
    816174880,
    345098340,
    145973440,
    816174880,
)

In diesem Fall wäre es "11076" sein. So geben Sie in der Konsole:

info line *11076

Das wird Ihnen sagen, die Zeile in Ihrem Code, wo die Ausnahme ausgelöst wurde.

Falsch geschriebene Parameter im Allgemeinen in einem führen sollte „Warnung: so und eine solche Aufgabe nicht zu Selektor x reagiert“ auf der Linie in Frage in gelb. Ich glaube, dies ist standardmäßig aktiviert, da ich keine Compiler-Einstellungen zu ändern, habe auf diese zu sehen.

Auch wenn ich eine abgefangene Ausnahme begegnen, ist es manchmal vorteilhaft in die GDB-Konsole fallen (kommen sollten, wenn Sie Ihre Anwendung ausführen) und geben Sie den folgenden Backtraces für alle Threads zu erhalten:

t a a bt

Was Sie getan haben, ist kein Fehler bei der Kompilierung, da die Objective-C-Laufzeitprüfungen zur Laufzeit, wenn ein Objekt auf die Nachricht antworten können Sie sie senden.

Ich empfehle das Hinzufügen dieses Build zu Ihrem Ziel oder Projekt einstellen:

GCC_TREAT_WARNINGS_AS_ERRORS = YES

Der Grund ist es kein Übersetzungsfehler ist, ist, weil es vollkommen gültig ist, eine Nachricht zum Zeitpunkt der Kompilierung nicht auf ein beliebiges Objekt (und jedes Objekt die Bearbeitung von Nachrichten auch dynamisch konfiguriert werden kann) bekannt zu senden. Alle Methodenaufrufe sind wirklich Nachrichten an Objekte gesendet werden.

In der Regel, wenn Sie irgendwelche Warnungen sehen Sie sie ansprechen sollen, wie in den meisten Fällen zu Problemen führen kann (wie Sie gesehen haben). Der irreführende Aspekt dabei ist, dass, wenn Sie eine Datei einmal kompilieren und es hat nur Warnungen, wenn Sie andere Klassen kompilieren, ohne Änderungen an der Klasse zu machen, die Warnungen hat, wird die Warnung nicht in den Compiler-Meldungen zu zeigen. So ab und zu können Sie wollen „alle Ziele reinigen“ und bauen wieder um sicherzustellen, dass Sie keine Warnungen sehen haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top