Ich bin ein bisschen verwirrt. Ich erstelle eine App mit Storyboard, und es auf iPad 1 ausgeführt. Die Anwendung verwendet eine Menge Speicher, so dass die 120 MB erreicht, stürzt ab. entsprechend dem, was ich verstanden habe, um dieses Problem zu beseitigen, müssen Sie freigeben, dealloc ... der Punkt ist, dass mit ARC sollte dies automatisch sein. In der Tat, wenn ich für z.B. hinzufügen: [label1 release]; es gibt mir einen Fehler. Aber diese ARC automatische Freigabe und Dealloc scheint nicht zu funktionieren! Liegt das daran, dass es verschiedene Wege gibt, mit ARC zu veröffentlichen?ARC Referenzzählung Dealloc und Release
Antwort
Sie müssen nicht manuell/release/Autorelease mit ARC behalten. Wenn Sie jedoch aktive Referenzen auf viele ungenutzte Objekte haben, bleiben diese im Speicher. Profiliere deine App mit Instrumenten und es zeigt dir, wie viele Objekte du für jede Klasse erstellst und wie viel Speicher sie verbrauchen.
Mit ARC müssen Sie noch über die Speichernutzung nachdenken, Sie müssen sich nicht so viel Gedanken über Speicherlecks machen.
NSObject *bigMemObj = [[BigMemClass alloc] init];
//This creates the object in memory. In both arc and manual counting the retain count is 1
//Do stuff
//Prior to ARC you would have had to call [bigMemObj release]; before setting the variable to nil
bigMemObj = nil
//With ARC you don't have to do anything. The compiler inserts the release at compile time
Lesen Sie auch die Dokumentation zur Erklärung von iVars __strong vs __weak.
Ohne auf Ihren Code zu schauen, ist es schwierig zu identifizieren, was den gesamten Speicher verbraucht, aber hoffentlich sollte das Ihnen helfen zu bestimmen, wo Sie anfangen sollen zu suchen.
Ich kann Ihnen den Code zeigen, aber ich weiß nicht, welcher Teil, weil es lang ist – Alessandro
, aber ich verstehe nicht. Was meinst du mit dem obigen Code? Wenn ich viele Labels/UIImageViews ... in einem NSMutablearray mit alloc erstellt habe? – Alessandro
Ich habe Instrumententest hinzugefügt: es sagt, es verwendet nur 2 MB obwohl (auch wenn es keine freie Speicher übrig zeigte). am ende stürzte es ab – Alessandro
Sie sollten innerhalb jeder Methode @autoreleasePool{}
implementieren. Im Wesentlichen wird jede Methode wie folgt aussehen:
-(void)methodName{
@autoreleasePool{
//do method stuff
}
}
Dies wird sichergestellt, dass bei der autoreleasePool verlassen wird, wird Speicher ordnungsgemäß freigegeben.
was soll ich zu // hinzufügen method stuff? – Alessandro
lol alles, was Sie Ihre Methode tun möchten. Wirklich, alles, was Sie tun, ist das Erstellen eines separaten AutoreleasePool in jeder Methode. Experimentieren Sie damit und sehen Sie, was wann veröffentlicht wird. Das habe ich erst erfahren, bis ich eine Endlosschleife gebaut habe. Durch die Verwendung von autoReleasePool war ich in der Lage, Instanzvariablen nahezu unbegrenzt zu loopen, zuzuordnen und freizugeben, bis das Array, das ich gerade füllte, einfach zu groß wurde. Wenn Sie nicht loopen, sollten Sie nur den Zeiger auf Null setzen können (wie Cesarislaw erwähnt). Wenn du es bist, lege den [self doLoop]; außerhalb des AutoreleasePool. – AMayes
Ok, also habe ich den obigen Code zu allen meinen Codes hinzugefügt. Alles funktioniert immer noch, aber es ergibt sich für die Instrumente die gleiche Speicherkapazität. Muss ich einen Abfluss oder etwas hinzufügen? (in Anbetracht, dass ich ARC verwende) – Alessandro
Ich kann das nicht abstimmen, sonst würde ich. Ich denke, Alessandro fragt nach ARC vs Freigabe und Dealloc, nicht über das, was er lädt!
Also, Alessandro, Ihr Verständnis ist richtig, dass mit ARC Sie nicht freigeben oder dealloc. Daher werden diese nicht funktionieren, wenn Sie ARC verwenden. Außerdem gibt es keine Alternative zu release/dealloc, da ARC diese nicht verwendet.
Mein Vorschlag wäre, zu sehen, was Sie in der App verwenden, die all diesen Speicher beansprucht. Haben Sie zum Beispiel eine große Anzahl von Bildern, die sehr groß sind? Halten Sie Grafiken so klein wie möglich und passen Sie die Auflösung des iPad an. Vor allem das iPad 1, das nicht über das "Retina Display" verfügt.
Sie können Autorelease-Pools in ARC verwenden. Hier ist eine Dokumentation, wann sie zu verwenden ist: Advanced Memory Management Programming Guide: About Memory Management
Sie können nur zu viel Zeug laden. Das Speichermanagement kann Ihnen dabei nicht helfen. Zeigen Sie viele Bilder oder Videos? – Dancreek
Ja, Bilder, aber es ist Teil der App! – Alessandro
Wie viele laden Sie sofort und wie groß sind sie? (Anzahl der Pixel, nicht die Dateigröße) In den meisten Fällen sollten Sie nur den Inhalt des Bildschirms im Speicher haben. Laden bei Bedarf. Nicht alles auf einmal. – Dancreek