Ratschläge, wie Sie zu fangen "Versuch zum einfügen von null-Objekt" von einem Gerät benötigt
Hier ist die situation:
Hockeyapp und testflight ab und beschweren sich dann über mich
", die versuchen, insert-null-Objekt"
in veränderlichen Wörterbücher/arrays. Ich weiß das richtige ist zu prüfen, für null die ganze Zeit, und ich weiß, wenn es Sinn macht.. Unsere Tester können nicht fangen diese Abstürze, aber AppStore-Nutzer natürlich.
Meine Vermutung ist, dass manchmal server gibt NSNulls, wenn es nicht sollte.
Also nicht einfügen-Prüfungen für nil überall in dem riesigen Projekt meine Idee war, erstellen Sie ein separates Ziel für die Tester und Methode swizzling für die collection-Klassen.
Sagen, ich werde ersetzen insertObject:atIndex
mit meinem swizzled_insertObject:atIndex
, wo, wenn das Objekt tatsächlich null I log/show einen aussagekräftigen Bericht, bevor es abstürzt.
Die Sache ist die ich nicht nutzen kann swizzling für __NSPlaceholderDictionary
oder __NSArrayM
(nur da kann ich nicht eine Kategorie auf private Klassen) und das macht mich traurig.
Also im Grunde Frage ich ja um Rat, wie fangen diese fiesen selten Abstürze.
Eine Lösung habe ich im Hinterkopf, ist die Verwendung von try-catch-Blöcke, ich weiß, Sie sind teuer in Objective-c, also würde ich Sie nicht verwenden in der Produktion nur für Tester. Aber Methoden, umgeben von try-catche
-s, umgeben von #ifdef
-#endif
-s löscht alle readableness der code. Also ich bin auf der Suche nach einer eleganteren Lösung.
Danke.
Update: der stack-traces sind unfortunaely nicht sehr aussagekräftig, hier ist was ich bekommen
Exception Type: SIGABRT
Exception Codes: #0 at 0x3a378350
Crashed Thread: 0
Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]'
Last Exception Backtrace:
0 CoreFoundation 0x321522a3 <redacted> + 163
1 libobjc.A.dylib 0x39e7a97f _objc_exception_throw + 31
2 CoreFoundation 0x320a355f <redacted> + 135
3 CoreFoundation 0x320da0d3 <redacted> + 51
....
nil
überall. Der stack-traces werden sollten, sagen Ihnen genau, Wann welche Zeile code in Ihrer app das problem verursacht. Fix ist, dass spezifische code. Aber nicht nur der check für nil
. Ermitteln Sie, warum Sie immer nil
in den ersten Platz.Das ist das problem - ich kann nicht feststellen, warum und wo, ich bin immer null. und der stack-traces sind nicht immer deskriptiven alles, was ich bekommen ist zum Beispiel: erminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert null-Objekt aus dem Objekte[2]'
Eine andere Sache: Sie scheinen verwirrend sein
nil
mit NSNull
. NSNull
ist ein Objekt; es ist Häufig als Platzhalter verwendet.Dies ist Andreas von HockeyApp.
<redacted>
ist in stack-traces, denn iOS stellt Sie dort. Für alle öffentlichen (nicht-NDA) iOS-releases, HockeyApp ersetzt diese mit dem richtigen system calls. Der Grund, warum <redacted>
erscheint in der ersten Stelle ist da die iOS-interne Optimierungen. Jedenfalls, wenn Sie Hilfe benötigen, sollten Sie poste den kompletten stack-trace, anstatt nur die ersten 4 Zeilen! Was iTunes Connect zeigt und was nicht erfahren Sie hier: stackoverflow.com/questions/15588072/...Nur um sicher zu gehen, den stack-trace HockeyApp Berichte ist in der Nähe von identisch, was iOS, schreibt in seinem crash-Berichte. Es ist nichts falsch mit den berichten per se. Und wie bereits in meinem vorherigen Kommentar hier, HockeyApp ist nichts zu tun, albern entweder.
InformationsquelleAutor dariaa | 2013-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht, um eine Kategorie hinzuzufügen, zu tun method swizzling. Ich war in der Lage zu isolieren, die einen Absturz wie dieser von method swizzling initWithObjects:forKeys:count: und setzen ein try/catch um das ursprüngliche Methode aufrufen. Endlich habe ich ein breakpoint in der catch-Abschnitt. Dies erlaubte mir, mich zu brechen und gehen Sie zurück in den stack, wo der null-Wert verwendet wurde. Dieser code Hinzugefügt wird, an der Spitze meiner AppDelegate.m:
Und dann in meiner app beendete die Start-Methode:
Dies hat mir geholfen, eine Anzahl von Zeiten. Sparen Sie sich die Probleme/Fehler versuchen zu arbeiten, die Methode, die Art der Kodierung ( "@@:**L" ), indem Sie die Obj-C runtime zu arbeiten ist es für Sie heraus: Methode m1 = class_getInstanceMethod(target, @selector(initWithObjects:forKeys:Zählung:)); const char *methodTypeEncoding = method_getTypeEncoding(m1); Anschließend können Sie dann, geben Sie dies in class_addMethod anstelle eines fest codierten string.
InformationsquelleAutor Dav Yaginuma
Eine Sache zu beachten auf die Absturz Meldung selbst.
"Versuch zum einfügen von null-Objekt aus dem Objekte[#]" bedeutet, dass entweder der Schlüssel oder der Wert an der Indexposition [#] (das denken eines NSDictionary literal-Liste) ist gleich null.
Sagen, ich habe ein dictionary-literal
Dann auf index[0] ist das erste paar in der Liste-index[1] wäre das zweite paar und so weiter. Wenn entweder der Eintrag des Paares ist null-es löst diese Ausnahme mit dem entsprechenden index.
InformationsquelleAutor SuperGuyAbe
davon ausgehen, dass Sie abrufen von Daten mit JSON vom server, einige Male ein Feld im JSON-Daten null ist,so können Sie NSNull nach coversion.
also mein Rat überprüfung "null" - situation in den server, wenn es Auftritt, senden Sie das faild msg ,aber nicht liefern, das schlechte format-Daten zu APP.
als APP erhalten wie jene Daten, die APP wird nicht wissen, wie es zu handhaben. es ist schon abnormal.
es ist okay, Sie können die Ausnahme abfangen und ignorieren die abnormalen Daten, aber auf meine Weise zu tun ist, um zu verhindern, dass es passiert von der Quelle.
InformationsquelleAutor adali
In den meisten system calls ( iOS) oder server-Kommunikation werden kann, nil, oder, wenn Sie arbeiten , aufrufende Funktion von third party libs.
Auf diese Fälle ist es ein muss, um zu überprüfen, einen null-Wert imho.
Mehrere senior-Entwickler, Architekten, die aus mehreren-Anweisung in on line.
Sehr schlecht Verhalten, ich lernt meine Lektion haben, schreiben Sie einfach in separate Linie zu wissen, welche Linie abgestürzt ist genau der code. Viel einfacher, es zu beheben.
Wenn Sie nicht finden können in Ihrem code. Es gibt Logger, crash-reporter-Bibliotheken. Verwenden als, und Sie werden die Ursachen, die Zeilennummer, einfach zu reparieren als die.
Ich würde nicht überall null-Prüfung noch mit try-catch, nur in oben genannten Fällen
InformationsquelleAutor
Nur gefunden, indem wir uns an wo ich bin erstellen NSDictionaries und das hinzufügen von ein paar assertion-Anweisungen, um zu überprüfen, ob Objekte sind gleich null.
@{@"
- start der Erstellung eines Wörterbuchs mit modernen syntax, oderNSDictionary
Ausführen der app, überprüfen Sie die Konsole, finden Sie die entsprechende assert-und Update es:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'das Objekt ist null hier'
InformationsquelleAutor Alex Stone
Ich habe versucht, eine Antwort auf die Dritte Antwort, es gibt mir helfen in den meisten Fällen. Allerdings, wenn Sie mein Projekt unterstützen, Rahmen 64, traf ich einen katastrophalen Ben Zusammenbruch, verursacht durch eine Dritte Partei, die statische Bibliothek. Ben Zusammenbruch Punkte CFDictionaryContainsKey.
Wenn Ben Zusammenbruch myDictionaryRef ist null.
Nach einigen Tests habe ich ein problem gefunden.
Vergleichen Antworten
Verschiedene Arten von Parametern verursacht, Ben Zusammenbruch.
also, ich denke, die richtige Antwort ist
Dank Antworten Anbieter, aber auch da hab ich genug Ruf 50. Ich kann nicht kommentieren direkt. Ich hoffe Sie geben mir eine Stimme.
InformationsquelleAutor Blowing a big balloon