Frage

Hier ist der Kern eines Code, den ich schreibe. Ich bin besorgt, dass ich die Rückhalte-/Veröffentlichungsprobleme mit der Array -Klassenmethode auf NSMutablearray nicht ordnungsgemäß angehze. Ist das folgende Gedächtnis tatsächlich und lecker?

for(a while) { 
    // do stuff
    NSMutableArray *a = nil;
    // do stuff
    if (!a) {
        a = [NSMutableArray array];
    }
} // for(a while)
War es hilfreich?

Lösung

Sie würden den Speicher in diesem Code nicht auslaufen und das Verlassen des Arrays selbst zu einem Absturz verursacht, wenn das Array am Ende der Laufschleife autorelea ist.

Die meisten Kakaokurse bieten einige Möglichkeiten, ein neues Objekt zu erstellen, und stimmen sehr überein mit dieser Konvention:

  1. [[NSSomeObject alloc] init] : Sie sind für die Veröffentlichung des Objekts (Instanzmethode) verantwortlich.

  2. [NSSomeObject someObject] : Das Objekt wird für Sie autorelea, normalerweise am Ende der Laufschleife (Klassenmethode). Es ist ungefähr gleichbedeutend mit [[[NSSomeObject alloc] init] autorelease].

Die ordnungsgemäße Verwendung der Instanzmethode wäre:

a = [[NSMutableArray alloc] init];
// do stuff
[a release];

Die ordnungsgemäße Verwendung der Klassenmethode wäre:

a = [NSMutableArray array];
// do stuff, array is in the autorelease pool

Beachten Sie, dass Apple Ihnen empfohlen hat, sich von den Convenience -Methoden so weit wie möglich fernzuhalten, um die Leistung zu verbessern. Das ist umstrittene Ratschläge, kann nicht viel Prozessorzeit sparen und trennt den Alloc-Init von der Veröffentlichung auf einem Objekt, das Sie möglicherweise nicht viel für die Aufbewahrung interessieren.

Andere Tipps

Von dem Kakao -Speicherverwaltungsregeln:

Sie übernehmen die Besitzung eines Objekts, wenn Sie es mit einer Methode erstellen, deren Name mit „Alloc“ oder „neu“ beginnt oder „Kopie“ (z. B. Alloc, NewObject oder MutableCopy) enthält oder wenn Sie es eine Haltungsnachricht senden. Sie sind dafür verantwortlich, die Eigentum an Objekten, die Sie besitzen, mithilfe von Release oder Autorelease abzugeben. Bei jedem anderen Mal, dass Sie ein Objekt erhalten, dürfen Sie es nicht veröffentlichen.

Deshalb mit der Linie:

a = [NSMutableArray array];

Sie übernehmen nicht die Verantwortung für das Array, und es wird an Sie autorelea übergeben. Der Speicher wird für Sie automatisch vom Autorelease -Pool behandelt. Sobald er nicht mehr verwendet wird, wird er für Sie freigegeben. Wenn Sie das Array jedoch außerhalb des aktuellen Ereignisses behalten möchten, müssen Sie es beibehalten, sonst wird es für Sie veröffentlicht.

Ja, wenn Sie möchten, dass es bei sich bleibt.

Das zurückgegebene Objekt ist ein autorietfreies Objekt, das bei der Säuberung seines Autorelease -Pools verhandelt wird.

Alle Array -Klassenmethoden, die mit "Array" beginnen, geben diese Arten von autoreleaseen Objekten zurück.

Lesen Sie dies Dokument von Apple.

Das ist gültig. Es kann helfen, Dinge manuell zu verwalten, wenn Sie Fragen haben, um zu lernen.

Es gibt eine Konvention:

  • Init Prefixe (init, initWithString :) Geben Sie eine Rückhaltung von 1 an, wo
  • Objektname Präfixe (String, StringWithString :) Zeigt ein autoreleaes Objekt an

Ich habe seit Jahren die Gewohnheit, auf der Anrufseite das zu veröffentlichen, was ich kann, anstatt sie für autorelea zu drängen. Einige Autorelease -Probleme sind dann schmerzlich schwer aufzuspüren. Sicher, Autorelease ist in diesem Fall ein Komfort für den Programmierer (vorausgesetzt, nichts geht schief), wirkt sich jedoch nachteilig auf Wiederverwendung, Klarheit und Leistung aus (Moreso in großen Codebasen/Programmen).

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