2017-02-16 4 views
0

Code wie folgt veröffentlichen:NSKeyedArchiver archivedDataWithRootObject: nicht Speicher useage

NSMutableData *data = [NSMutableData dataWithLength:10*1024*1024]; 
for (int i = 0; i < 10; i++) { 
    NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:data]; 
    NSLog(@"%lu", (unsigned long)[archiveData length]); 
} 

Set Bruchstelle an in der for-Schleife, wird es der Speicher useage sehen erhöhen: 10MB -> 20MB ....-> 100 MB, wenn es aus der for-Schleife heraus ist, gibt es immer noch keinen Speicher frei.

Nur wenn ich den Prozess fortsetze (kann in die nächste Hauptschleife gehen), verringert sich die Speicherbelegung um 100MB.

PS: Schalten Sie die ARC/deaktivieren Sie die ARC und verwenden Sie Keyword-Release ist das gleiche Ergebnis.

Antwort

2

Was Sie hier sehen können, ist die NSAutoreleasePool bei der Arbeit. Ändern Sie einfach Ihre Schleife zu:

Dies führt zu einer langsameren Laufzeit, sollte aber die Speicherauswirkung enorm reduzieren.

Alle Convenience-Konstruktoren (ähnlich wie [MyClass myClassWithSomething]) werden immer Objekte zurückgeben, die sich im Autorelease-Pool befinden (weil das der Vertrag mit manuellem Retain/Release-Code ist).

Der "Standard" Autorelease-Pool befindet sich normalerweise in der aktuellen NSRunLoop und wird nach jedem Ereignisbehandlungszyklus freigegeben. Wenn Sie innerhalb eines Zyklus zu viele Objekte erstellen, wird der Pool einfach wachsen und wachsen. So können Sie manuell einen inneren Autorelease-Pool erstellen, der dann häufiger gelöscht wird.

+0

Ich versuche '' '@ autoreleasepool''' hinzufügen, es immer noch nicht Speicher sofort freizugeben, mein Problem ist der Speicherverbrauch in der for-Schleife ist zu groß, ich versuche den Code in für Schleife zu' '' dispatch_async '' ', es funktioniert, aber ich mag diese Lösung nicht. – waitianlou

+0

Es hängt davon ab, was Sie in Ihrer Schleife tun. Das Beispiel, das Sie angegeben haben, sollte sofort den Speicher freigeben, den 'archicedDataWithRootObject' angefordert hat, sodass ich Ihnen nicht mehr sagen kann, ohne mehr über Ihren Code zu wissen. –

+0

Sie sind richtig, das Problem ist Speicher in UIPastebord nicht freigeben. Ich poste eine andere Frage, danke. – waitianlou

Verwandte Themen