2009-03-03 5 views
5

Ich habe einige Code in meiner Anwendung, die etwa wie folgt aussieht:Warum gibt Cocoa gelegentlich eine leere Zeichenfolge zurück?

char *hash = (char*) sqlite3_column_text(get_bookmark, 0); 
NSString* postHash = [NSString stringWithUTF8String:hash]; 

für mich jedes Mal Dies funktioniert; Ich habe es nie nicht Arbeit gesehen. Die meisten meiner Benutzer haben keine Probleme (soweit ich weiß). Allerdings finde ich, dass postHash eine leere Zeichenfolge (@"") für einige Benutzer die Zeit ist.

Kann jemand erklären warum?

Einige mehr Kontext/Spekulation:

Dies scheint nur auf jailbroken Handys passieren. Gibt es etwas anderes an ihnen? Ich nehme an, dass normalerweise weniger Speicher verfügbar ist. Gibt es noch etwas, das hier etwas beitragen könnte?

postHash wird in einer Tabellenzelle verwendet und wird gelegentlich korrekt ausgefüllt angezeigt, daher bin ich einigermaßen zuversichtlich, dass der Datenbankaufruf funktionieren sollte. In der Tat, wenn die Datenbank auch eine leere Zeichenfolge hat, liegt das an einem sehr ähnlichen Code, daher bleibt die Frage bestehen.

hash wird sicherlich mit einem Nicht-Null-Wert zurückgegeben. Wenn ich hier einen NULL erzwinge, stürzt die App ab. Ebenso ist postHash nicht nil als das würde auch die App zum Absturz bringen (aus dem gleichen Grund).

Ich denke, dass dies möglicherweise Speicher verwandt ist. Wenn die Methode versucht, zu viel Speicher zuzuweisen, bevor -didReceiveMemoryWarning aufgerufen werden kann, was passiert? Ich weiß, dass das Springboard irgendwann die App auswirft. Aber ist es möglich, dass Cocoa hier eine Null-Zeichenfolge anstelle des erwarteten Werts zurückgibt? Ich habe von einigen Berichten gehört, die, soweit ich das beurteilen kann, nur durch eine leere Saite verursacht worden sein können, wo etwas länger hätte sein sollen.

Alle anderen Spekulationen, Theorien oder Ideen willkommen.

+0

"Aber ist es möglich, dass Cocoa hier eine Null-Zeichenfolge anstelle des erwarteten Werts zurückgibt?" Eine "Null-Zeichenfolge" wäre entweder NULL (die C-Zeichenfolge) oder Nil (die NSString).Eine leere Zeichenfolge ist völlig anders: Es ist eine Zeichenfolge ohne Zeichen, während NULL/NULL keine Zeichenfolge ist. –

+0

Das ist nicht mein Verständnis davon, was eine "Null-Zeichenfolge" ist. Wenn ich "Nullzeichenfolge" oben sage, meine ich "leere Zeichenfolge", d. H. @ "" In Objective-C oder "" in C. Ein Null/Null-Wert bewirkt, dass die App abstürzt. –

+0

"Null" bedeutet 0. Das Nullzeichen ist '\ 0'; h., 0. Der Nullzeiger ist 0. In C gibt es keine "Null-Zeichenkette", denn wenn sie Null ist, ist sie keine Zeichenkette; es ist nur 0. –

Antwort

6

Allerdings finde ich, dass postHash eine leere Zeichenfolge (@"") für einige Benutzer die Zeit ist.

Kann jemand erklären warum?

Da hash eine leere Zeichenfolge ist (hash[0] == '\0').

+0

Ich stimme zu, dass dies das wahrscheinlichste Szenario wäre, aber wie in der Frage angemerkt, bin ich ziemlich zuversichtlich, dass es keine leere Zeichenfolge sein kann. –

+2

Es ist nicht "das wahrscheinlichste Szenario"; Es ist das * einzige * Szenario. NULL bekommt eine Ausnahme. Jede nicht leere Zeichenfolge erhält eine nicht leere Zeichenfolge. Nur eine leere Zeichenfolge erhält eine leere Zeichenfolge. Einfacher Beweis: NSLog die Länge in (strlen (Hash)) und Länge ([postHash Länge]). –

4

Endlich habe ich die Lösung gefunden. Ich werde Peter die akzeptierte Antwort geben, da er recht hat, aber der Grund, warum ich eine leere Saite bekam, ist ... interessant.

Die Datenbank ist korrekt ausgefüllt. Die Abfrage ist auch korrekt. Der Unterschied zwischen meinem Handy und meinen Nutzern besteht darin, dass sie kaputte Handys haben. Und offensichtlich verwenden im Gefängnis kaputte iPhones manchmal eine andere Version von SQLite als in den Versandversionen von iPhone OS.

Die Änderung in Version enthüllte einen Fehler in meinem Code, der einen der Parameter falsch festgelegt und sqlite3_column_text eine leere Zeichenfolge zurückgeben.

+3

Es muss eine Möglichkeit geben, ein Jailbroken-Telefon zu erkennen und dann die Benutzerunterstützung abzulehnen. Wie viel Zeit hast du deswegen verschwendet? Es ist nicht an. – mxcl

+0

Schwierig, aber ich glaube, ich habe ungefähr zwanzig Stunden gebraucht - und ich habe die Lösung nur zufällig gefunden! Auf der anderen Seite zahlten sie Kunden. Trotzdem habe ich gesagt, dass ich mir das Recht vorbehalte, nicht ins Gefängnis gefallene Telefone zu unterstützen. Ich schrieb mehr über den App-Blog: http://www.yummyapp.com/2009/05/pirates-and-jail-break.html –