Frage

Ähnlich dem Speicherverlust-Problem bekannt in Bezug auf die Erstellung und eine Instanz der UIImagePickerController zu zerstören, ich finde ähnliche Probleme in Bezug auf Instanzen der UIViewController Klasse. Der empfohlene Weg, um die UIImagePickerController zu verwenden ist die Instanz einmal zu erstellen und halten es um für die Lebensdauer der Anwendung, obwohl dieser Speicher aufbrauchen, die Sie an anderer Stelle benötigen.

Die Situation mit Ich bin den Umgang beinhaltet zwei Instanzen der UIViewController Klasse. Beim Start wird die erste Instanz erstellt und seine Sicht auf eine andere „main“ UIViewController Klasse hinzugefügt wird, die Teil des MainWindow.xib ist. Auf dieser ersten Instanz ist eine „Info“ Taste, dass, wenn angezapft, wechselt auf eine neue Instanz der UIViewController Klasse (falls es nicht bereits erstellt wurde). Der „main“ UIViewController verwaltet diese Umschaltung mit der üblichen Flip-Animation. Der Grundaufbau kann in der zu sehen ist "Beginning iPhone Entwicklung: Exploring the iPhone SDK". Buch von Dave Mark

Das Problem, das sich stellt, ist, dass, sobald die „Info“ Taste das erste Mal angezapft wird, Speicher auf die neue zweite UIViewController Instanz zugeordnet ist, und es wird nicht freigegeben, bis die Anwendung beendet. Aufgrund der Anzahl der Elemente auf dieser Info Ansicht, verwendet es etwa 1 MB VRAM einmal instanziiert und seine Sicht auf die Superview hinzugefügt wird. Alle Versuche, konsequent zu zerstören und neu erstellen diese Instanz zu einem Speicherverlust, ähnlich dem, was existiert, wenn Sie versuchen, die gleiche Sache zu Instanzen der UIImagePickerController Klasse zu tun. Ich vermute, dass die Ursache die gleiche zwischen den beiden Klassen ist.

Der Kern meines Problems beinhaltet, um so viel Speicher frei zu haben, bevor ich es dem Benutzer ermöglichen, ein Bild mit der Kamera aufzunehmen. Sobald jedoch der Benutzer ein Bild aufgenommen hat und sie sehen das resultierende Bild das erste Mal durch, werden sie auf der „Info“ Taste tippen erlaubt, die auf der ersten UIViewController Instanz existiert. Einmal angezapft, entfernt die „main“ UIViewController die Ansicht der vorhandenen UIViewController und ersetzt sie mit dem für den Info-Bildschirm. Der Info-Bildschirm hat ein „Zurück“ -Taste, um die Ansichten zu wechseln. Sobald jedoch der Benutzer des Info-Bildschirm verläßt und wählt ein anderes Bild mit der Kamera aufzunehmen, wobei der Speicher auf den Info-Bildschirm zugewiesen ist noch im Speicher.

Die UIImagePickerController Klasse vorübergehend fast 15-18MB verwendet, während es das 2-Megapixel-Bild verarbeitet, bevor seine internen Referenzen und die „imagePickerController: didFinishPickingImage“ Freigabe Delegat aufgerufen wird. Ich laufe in Low-Memory-Benachrichtigung, sobald die zweite UIViewController Instanz hat über die Info-Taste erstellt und dann wählt der Benutzer ein weiteres Bild aufzunehmen.

Speicher technisch undicht ist nicht, ob Sie Bilder über und über mit oder ohne Klopfen auf der Info-Button in meinem Fall nehmen, aber wegen anderen Fragen in Bezug auf Hintergrundprozesse auf dem iPhone (Safari, etc.), die außerhalb Ihrer Kontrolle ist, Sie müssen viel Speicher wie möglich freizugeben, während sie mit Dingen wie der Kamera arbeiten.

Alle Ratschläge, wie Instanzen der UIViewController Klasse sauber zu erzeugen und zerstören, so dass ein Speicherleck nicht?

War es hilfreich?

Lösung

Laden Sie den zweiten View-Controller von einem NIB? Wenn ja, möchten Sie überprüfen, ob Sie richtig den zugehörigen Speicher sind freigegeben wird.

Hier ist, was ein typischer NIB-basierten View-Controller wie in meinen Projekten aussieht.

SomeViewController.h

@interface SomeViewController : UIViewController {
    UILabel *someLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *someLabel;

@end

SomeViewController.m

@implementation SomeViewController

@synthesize someLabel;

- (void)dealloc {
    // Release our retained IBOutlets
    self.someLabel = nil;
    [super dealloc];
}

@end

Andere Tipps

Eine Möglichkeit, die Speichernutzung zu reduzieren wäre das Bild, um die Größe, was Größe Sie wollen (es sei denn natürlich möchten Sie ein 320x480 Bild). Das hat mir sehr geholfen in meinem Fall.

Ist die zweite Viewcontroller Sie Änderung sprechen? Wenn nicht, dann wäre es am besten sei es ein Singleton zu machen und die gleiche Instanz verwenden. Sie können jederzeit die von dem Viewcontroller verwendet, um Werte ändern. diesem Artikel erklärt, wie Sie Singleton-Objekte erstellen können ( mit dem Code)

Ein weiterer Artikel hier zeigt die Verwendung einer Singleton-Klasse (wenn auch anders Ihren Anwendungsfall, es soll klären, wie Singletons verwenden)

Ich würde vorschlagen, auch ein Singleton-Objekt für UIImagePickerController zu schaffen.

Haben Sie Zyklen in der Kette des Eigentums? So etwas wie:

@interface FirstViewController: UIViewController {
  SecondViewController *secondViewController;
}
@end

@interface SecondViewController: UIViewController {
  FirstViewController *firstViewController;
}
@end

Wenn Sie nicht explizit diesen Zyklus brechen, wenn Sie diese Ansicht-Controller zu verwerfen, werden sie undicht werden.

Auch ich glaube, dass Sie für die Freigabe aller Top-Level-Objekte verantwortlich sind, die aus einer Nib-Datei geladen werden, wenn Sie sie nicht mehr benötigen.

Vielleicht könnten Sie das Bild speichern, bevor in die Infoansicht Übergang. Nach dem Speichern lassen Sie das Bild und dann in die Info-Ansicht wechseln. Wenn der Benutzer zurück geht, laden Sie das Bild aus dem Ordner.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top