2009-06-27 6 views
1

Ich habe gerade mein Projekt von Lecks befreit, aber es gibt immer noch Tausende von Objekten unter der Kategorie "GeneralBlock-0". Die Anzahl der Nettozuweisungen ist durch das Dach (es nähert sich eine Million, wie ich tippe), aber keine von ihnen sind Lecks und keiner von ihnen hat eine Größe größer als 0 Bytes.Tausende neuer Objekte der Größe 0 werden meiner Nettogesamtmenge jede Sekunde hinzugefügt, sollte ich mir Sorgen machen?

UPDATE & EDIT:

Quartz ist für alle die problematische Objekte verantwortlich.

Die verantwortlichen Anrufer sind (in der Reihenfolge der Ausführung pro Iteration der Spielschleife:

-[CALayer setPosition:] 
x_hash_table_new_ // x2 
hash_table_modify 
-[CALayer setPosition:] // x9 
-[CALayer(CALayerPrivate)_copyRenderLayer:flags:] //x13 

Wenn auf einem Gerät ausgeführt werden, 48 Byte große Objekte werden unter GeneralBlock-64 zugeteilt, 128, 256 usw. mit . die gleichen Eigenschaften wie oben beschrieben Diese ist nicht akzeptabel, da es offensichtlich eine signifikante Verlangsamung verursacht Dies ist, was Code in meinem Projekt das Problem verfolgt wird.

topRow.center = CGPointMake(topRow.center.x,topRow.center.y-PIXELS_PER_FRAME); 
while (nextRow = thisTopRow.below) { //stops running when thisTopRow.below is nil 
    nextRow.center = CGPointMake(nextRow.center.x,nextRow.center.y-PIXELS_PER_FRAME);  
    if (nextRow.center.y+20 < 401 && !nextRow.userInteractionEnabled) 
     [nextRow enableInteraction];   
    thisTopRow = nextRow; 
} 

I w als unter dem Eindruck, dass CGPoint ein Typ war, und würde am Ende des Codeblocks freigegeben werden. Warum hemmt es meine Erinnerung? Wenn es darauf ankommt, werde ich die Trace-Datei hochladen, die ich für Interessierte in Instrumenten gespeichert habe, aber ich bin mir ziemlich sicher, dass ich alles abgedeckt habe.

+0

Das gleiche Problem tritt in iTennis von iCodeBlog.com, ein Tutorial, das ich verwendet habe, um loszulegen. Alles deutet darauf hin, die Position einer UIImageView zu ändern, entweder durch Ändern der Mitte oder des Frames. – Tozar

Antwort

1

Angenommen, Sie können das Verhalten unter dem Simulator duplizieren, stellen Sie sicher, dass die RSIZE Ihrer Anwendung nicht auch mit 'top -u' in einem Terminal zunimmt.

Dies ist am wahrscheinlichsten, weil QuartzCore seine eigene Zuweisungs- und Zuteilungszone implementiert hat, aber noch nicht vollständig in den Mechanismus zur Statistikerfassung integriert ist, den die Instrumente verwenden.

Bitte melden Sie einen Fehler.

+0

Du hast mich dort verloren ... kannst du mir erklären, was du mir als Laie erzählen willst? – Tozar

+0

Der Befehl 'top' zeigt Informationen über Prozesse an. Bill schlägt vor, von Terminal aus zu starten und das Verhalten von RSIZE (resident memory size) für Ihre Anwendung zu beobachten. Er schlägt vor, dass Geräte QuartzCore-Speicher möglicherweise nicht überwachen, der in einer anderen Zone (Speicherbereich) als die Standardeinstellung für "normale" Objective-C-Objekte zugewiesen werden kann. Grundsätzlich, wenn die Instrumente sagen, dass Sie massive Lecks haben, aber "top" zeigt, dass RSIZE stabil bleibt, dann ist Instruments falsch, weil es nicht die richtigen Werte für den Speicher von QuartCore bekommt.Wenn ja, einen Fehler einreichen - http://bugreport.apple.com –

0

Gleiches Problem auch ... Null-Bytes werden im Simulator zugewiesen, aber im Gerät für jeden Methodenaufruf in CALayer erhöht sich mein Speicher mit 48 Bytes.

Dies führt zu Speicherproblemen.

Murali.

+0

Ja, Sie und niv erleben das gleiche Problem, das ich bin. Ich bekomme auch die Kosten für die Zuweisung von 48 Bytes für jede Instanz von UIImageView, die den Standort nur auf dem Gerät ändert, aber ich benutze kein UIScrollView. Denken Sie auch daran, dass Sie eine Antwort geschrieben haben, wenn dieser Beitrag keine Antwort auf die Frage bietet. Bitte verwenden Sie in Zukunft die Schaltfläche "Kommentar hinzufügen" unter der Frage, um einen Kommentar abzugeben und den Abschnitt "Antworten" für Lösungen zu reservieren. – Tozar

0

Ich habe auch mit diesem Problem zu tun. Ich verwende A UIScrollView mit einigen UIImageViews darin, und jedes Mal, wenn sich der Offset der Bildansicht ändert, wird ein Aufruf von - [CALayer (CALayerPrivate) _copyRenderLayer: flags:] durchgeführt, der den Speicher um 48 Bytes erhöht.

Wieder - auf dem Simulator wird dies als 0 Bytes protokolliert, aber auf meinem Gerät ist es ständig in meinem Gedächtnis zu essen.

+0

Dies ist auch ein Problem, das für mich aufkommt. Bitte beachten Sie den Kommentar zu Murali Beitrag. Als neuer Benutzer müssen Sie etwas lesen. – Tozar