2010-07-27 11 views
6

Ich habe eine Ansicht Controller zeigt UITextField. Hier bringe ich TastaturSpeicherverlust auf der Tastatur zu entlassen

- (void)viewDidAppear:(BOOL)animated 
{ 
    [wordTextField becomeFirstResponder]; 
} 

Dann habe ich Taste, die die Tastatur Abweisung ohne Controller Schließen selbst:

- (void)cancel:(id)sender 
{ 
    if([wordTextField isFirstResponder]) 
    { 
     [wordTextField resignFirstResponder]; 
    } 

} 

Nach dieser Instrumente zeigen mir ein Leck auf

# Category Event Type Timestamp RefCt Address Size Responsible Library Responsible Caller 
0 Malloc 128 Bytes Malloc 00:11.239 1 0x3b82550 128 UIKit UIKeyboardInputManagerClassForInputMode 

Irgendwo in der Stapel [wordTextField resignFirstResponder] erwähnt.

Auch wenn ich selbst keine Tastatur mitbringe und den Benutzer auslösen lasse, habe ich immer noch ein Leck. In diesem Fall ist nichts von meinem Code im Stack erwähnt.

+0

Nur für den Test habe ich neue Ansicht-basierte Projekt mit einzelnen 'UITextField', nichts anderes. Wenn Sie auf das Textfeld tippen, wird kbd angezeigt und der oben erwähnte Speicherverlust verursacht. Ich benutze Instrumente 2.1 und Xcode 3.2.2. Sollte ich dieses Leck ignorieren? – Pablo

+0

Simulator oder Gerät? Wenn es das Gerät ist bitte posten Sie ein Beispielprojekt, neugierig, dies zu sehen. –

+0

Es ist Simulator, aber immer noch interessiert, um sicherzustellen. Wird später am Gerät nachsehen. Zusammen mit diesem in meinem ursprünglichen Projekt habe ich 2 'open_handle_to_dylib_path', die, soweit ich aus dem googling verstehe, falscher Alarm mit Simulator sein könnten. Aber konnte nichts über 'UIKeyboardInputManagerClassForInputMode' finden, also könnte etwas ernstes sein. – Pablo

Antwort

7

Das Leaks-Instrument zeigt Ihnen Speicher, der im normalen Verlauf der App nicht frei ist (weil es keine Referenzen darauf gibt). Das ist kein großes Problem, es wird kostenlos sein, wenn die App beendet wird. Ein Großteil des Framework-Codes wird diese sehr kleinen Speicherblöcke allokieren und belassen. Ich habe keine Ahnung, ob sie Fehler sind oder essentiell für das Funktionieren der App. Was auch immer, wir müssen akzeptieren, dass sie völlig normal sind.

Lecks identifizieren diese Speicherbereiche als "Lecks" und das hört sich schlecht an, aber dies sind nicht wirklich die "Lecks", die das Gerät zur Identifizierung verwendet. Die 'echten' Lecks befinden sich im Code, der viele Male ausgeführt werden kann und den Speicher freigibt, der nie freigegeben wird. Im Laufe der Zeit wird mehr und mehr Speicher verbraucht, bis der gesamte Speicher belegt ist und die App abstürzt.

Also, wenn Sie eine App haben, egal wie lange Sie es verwenden oder egal wie Sie es verwenden, es "leckt" 128 Bytes in einem Apple-Framework müssen Sie sich normalerweise keine Sorgen machen.

Wenn Sie jedoch eine App haben, die besagt, dass jedesmal, wenn Sie auf eine Schaltfläche klicken, eine neue Zeichenfolge zugewiesen wird, die nie freigegeben wird - egal wie viele Bytes die Zeichenfolge ist - wenn der Benutzer die Schaltfläche mehrmals genug gedrückt hat all den Speicher für App und schließlich zum Absturz bringen. Dies ist die Art von Leck, auf die Sie achten müssen.

Das Lecks Instrument realistisch kann nicht den Unterschied zwischen den beiden Arten unterscheiden, aber Sie müssen dazu in der Lage sein. Möglicherweise möchten Sie eine Art Singleton-Objekt, bei dem es beispielsweise immer nur eine Instanz gibt, die für die gesamte Lebensdauer Ihrer App vorhanden sein muss. Sie erstellen das Objekt beim Start der App und realistisch gesehen müssen Sie dieses Objekt nie freigeben. Es kann beendet werden, wenn die App beendet wird. Leaks wird es als ein Leck markieren, und einige andere Entwickler, mit denen du arbeitest, die annehmen, dass dies bedeutet, dass du nicht weißt, was du tust, werden deinem Chef wie ein kleines Kind begegnen und sagen: "Er schreibt wirklich undichten Code, und das ist reeeeally schlecht ". Und dein Chef, der kein Programmierer ist, wird ihn ernst nehmen, weil es sich schlecht anhört und sowieso hat er einen 2.2 in CS von einer seriösen Universität gekratzt, damit er wissen muss, wovon er redet. Wenn es wirklich ganz vernünftig ist und genau das, was du vorhattest.

Verwenden Sie das Leaks-Instrument, um Fehler in Ihrem Code zu finden, die Ihre App ruinieren. Mach dir keine Sorgen über jedes Byte, das in einem Apple-Framework "Leaking" gefunden wird.

+0

@iPhoneDev: Danke. BTW, auf dem Gerät gab es kein solches in den Instrumenten erzeugtes Loch. – Pablo

Verwandte Themen