hat Speicher-Warnung empfangen und stürzt ab

8

Ich möchte mehrere Bilder in der Bildlaufansicht anzeigen, wenn mehr als 70 Bilder abstürzen und der empfangene Speicherfehler angezeigt wird. Ich habe die Bilder aus dem Dokumentverzeichnis

abgerufen

Ich habe es versucht -

%Vor%

Wie kann ich mehrere Bilder in scrollview anzeigen?

    
sohil 26.05.2015, 11:10
quelle

7 Antworten

9

Der Rat, den andere gegeben haben, um zu einem UICollectionView zu wechseln, ist gut, hat aber den wirklichen Fehler in deinem Code verfehlt: Die Methode imageNamed: von UIImage hält alle 70 deiner Bilder für immer im Speicher. Pro Dokumente:

  

Wenn Sie eine Bilddatei haben, die nur einmal angezeigt wird und möchte   Achten Sie darauf, dass es nicht zum Cache des Systems hinzugefügt wird   Erstellen Sie stattdessen Ihr Bild mit imageWithContentsOfFile :. Dieser Wille   halten Sie Ihr Single-Use-Image möglicherweise aus dem System-Image-Cache   Verbesserung der Speicherbenutzungseigenschaften Ihrer App.

Wenn Sie zu dieser Methode wechseln, werden die Abstürze verhindert, wenn Sie nur die Bilder laden, die Sie benötigen. UICollectionView macht dies trivial, da Sie das Bild nur laden können, wenn Sie in der Sammlungsansicht aufgefordert werden, ein Zellobjekt in der Methode collectionView:cellForItemAtIndexpath: der Datenquelle auszufüllen.

    
Ben Pious 30.07.2015 06:43
quelle
5
%Vor%     
Dnyaneshwar Wakchaure 26.05.2015 11:52
quelle
2

Sie ordnen und fügen die Bilder hinzu, die den Speicher zum Absturz bringen, da alle Bilder den Gerätespeicher beanspruchen. Es gibt viele Lösungen, die die Bilder zeigen. Am besten benutzt man die UICollectionView, die nur die Bilder lädt Bildschirm. Sie gehen für jede gute Anleitung, die Ihnen zeigen kann, wie es geht, hier ist die Referenz

    
Retro 26.05.2015 11:17
quelle
2

Vielleicht kann NSCache Ihnen helfen.

1 Wenn Sie Bild bei Index 10 anzeigen. Sie können Bild 5-9 und 11-16 zu NSCache /

zwischenspeichern

2 Wenn scrollView den Bildlauf startet, holen Sie sich ein Bild von NSCache, das Sie benötigen, und entfernen Sie das Objekt, das Sie nicht anzeigen müssen.

3 Ich denke, das kann effizient sein. Apple stellt eine Demo zur Verfügung, wie sie mit den riesigen Assets umgehen, die Caches und UICollectionView verwenden. Sie sehen es sich an.

Ссылка

    
Dikey 29.07.2015 06:38
quelle
1

Ich habe auch das gleiche Problem gesehen, das ich unter Verwendung der einfachen Linie gelöst habe.

instead of using this:

%Vor%

try using this:

%Vor%

Ich hoffe, es würde Ihr Problem lösen, indem Sie mit imageWithContentsOfFile Speicher freigeben. Sie erhalten also nicht Memory Warning

UPDATE Sie können auch Bilder von einer beliebigen Remote-URL und auch vom Dokumentverzeichnis Ihrer Anwendung anzeigen, indem Sie andere Methoden von UIImage Class

verwenden

sag, ob es hilft

    
Syed Ali Salman 03.08.2015 12:28
quelle
0

Sie können es mit UITableView versuchen. Angenommen, Sie haben eine Anzahl von Bildern -

%Vor%     
Santu C 26.05.2015 11:44
quelle
0

Verwenden Sie @autoreasepool. Hier sind Details zu @autoreleaspool

Die Anweisung @autoreleasepool führt die gleiche Aufgabe wie zuvor aus, statt die Klasse NSAutoreleasePool zu verwenden. Die Art und Weise, wie das NSAutoreleasePool funktionierte, war etwas komisch, da das Erstellen eines NSAutoreleasePools einen Effekt in der gesamten Anwendung verursachte; @autoreleasepool erstellt einen Bereichsbereich und macht es klarer, was sich innerhalb des Pools befindet und wann es drainiert wird (wenn es den Gültigkeitsbereich verlässt). Es ist auch effizienter nach Apple.

Das Konzept eines Autorelease-Pools ist einfach, wenn eine Objektinstanz als Autorelease markiert wird (zum Beispiel NSString * str = [[[[NSString Alloc] InitWithString: @ "Hallo"] Autorelease];), wird es behalten haben Zählung von +1 zu diesem Zeitpunkt, aber am Ende der Laufschleife wird der Pool geleert, und bei jedem Objekt, das mit Autorelease markiert ist, wird der Retain-Zähler dekrementiert. Es ist eine Möglichkeit, ein Objekt herumzuhalten, während Sie alles vorbereiten, was es für sich selbst behalten wird.

Während ARC das Autorelease-Schlüsselwort nicht vom Entwickler verwendet, fügt das zugrunde liegende System, das ARC verwaltet, das für Sie ein. (Denken Sie daran: Alle ARC-Vorgänge führen zu den entsprechenden Zeiten für Sie Retain-, Release- und Autorelease-Aufrufe ein). Aus diesem Grund muss das bestehende AutoreleasePool-Konzept beibehalten werden.

Wenn Sie den Autorelease-Pool entfernen, beginnen Ihre Objekte zu lecken Weitere Informationen finden Sie hier

    
Vishal Khatri 01.08.2015 11:32
quelle

Tags und Links