2010-11-20 8 views
0

Ich würde gerne wissen, wenn eine Methode im folgenden Format aufrufen, ist ein Grund für Lecks?sqlite Abfrage in iPhone verursacht Leck

[userLookupWS initWithUsername:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 2)] andPassword:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 3)] andURL:[NSString stringWithFormat:@"%@%@", [NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 0)], [NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 1)]] andSSL:[NSString stringWithUTF8String:(char *)sqlite3_column_text(select_system, 4)]]; 

Was umgekehrt ist Parameter dieser Methode zu übergeben, wie ich in dieser Aussage 100% Speicherleck bin immer!

Grüße, Accilies

+0

Was genau Leckage? Die userLookupWS-Instanz vielleicht? Dann veröffentlichen Sie es nicht und es ist nicht die Schuld von SQLite verwandten Sachen. Wo weisen Sie zu? – Pascal

+0

Verwenden Sie [FMDB] (http://github.com/ccgus/fmdb). –

+0

Ich denke, die Informationen sind nicht genug. Von diesem Zeilencode kenne ich nur den userLookupWS, der schließlich nicht freigegeben wird, so dass Speicherleck entsteht. – AechoLiu

Antwort

1

Warum senden Sie initWithUsername: an ein Objekt, das in einer Variablen gespeichert ist? Sie sollten das Ergebnis von alloc direkt dort übergeben() und niemals eine vorhandene Instanz neu initialisieren.

Abgesehen von nur seltsam zu sein (sie bereits initialisiert wird! Warum Sie es wieder? Initialisieren), fast alle init… Methoden geschrieben werden für die Annahme, dass sie werden nur einmal pro Instanz aufgerufen werden, so eine initWithWhatever: Nachricht an ein Senden Bereits initialisierte Instanz wird alles verlieren, was diese Instanz besitzt.

Es gibt keine gute Möglichkeit, das zu beheben, außer das einfach nicht zu tun. Senden Sie keine init Nachricht an eine bereits initialisierte Instanz. Der einfachste Weg, dies zu vermeiden, besteht darin, nur eine init Nachricht direkt an den Rückgabewert alloc ([[SomeClass alloc] init…]) zu senden.

Und natürlich, alles alloc zurückgibt, müssen Sie freigeben. Der einfachste Weg, dies zu gewährleisten, ist die sofortige Freigabe des Objekts: [[[SomeClass alloc] init…] autorelease].

+0

Danke für die Antwort Peter. Das macht Sinn. Ich folgte dem Schritt wie erklärt und es reduzierte das Speicherleck von 100% auf dieser Zeile auf 9%. Wenn ich nun weiter nachforsche, habe ich festgestellt, dass ich stattdessen das Leck von CFStringCreateWithFormatAndArgumentsAux erhalte. Was ich glaube ist von der Inline-Zuweisung von NSSTRING in meinem Code .. [NSString StringWithFormat: @ "% @% @" ... denkst du, ich sollte sie separat zuweisen und dann freigeben? – Accilies

+0

Ich habe keine Ahnung, was Sie mich fragen. Das ist keine Aufgabe. Ist es der String, der durchgesickert ist, oder etwas, das von 'CFStringCreateWithFormatAndArgumentsAux' zugewiesen wurde? –

+0

Danke für die Antwort Peter, was ich meine zu fragen ist, dass ich von meinem Stück Code, NSSTRING * AA = [[NSSTRING ALLOC] INITWITHFORMAT ...] tun und dann diese AA wie folgt verwenden soll: [userLookupWS initWithUsername : AA ... usw. wird dies einen Unterschied in dem Speicherverlust-Problem mit NSSTRING machen? – Accilies

0

Der initxxx Name Methode lassen vermuten, dass ein Objekt zurückgegeben wird, dass in Ihrer Verantwortung frei ist, also ja, wenn Sie nicht über das Objekt freigeben können einen Speicherverlust bekommen.