Frage

Ich habe über autoreleasepool gelesen hatte, aber es gibt einen Punkt, der ein wenig unklar für mich ist. Ich habe einige Funktionen Threads, die separate Speicherverwaltung autoreleasepool Verwendung erforderlich.

Im folgende Beispiel ist richtig

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = @"Hello";

   [pool release];
}

Ist das richtig?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [pool release];
}

oder das?

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];

   NSString *myString = [[NSString alloc] initWithString:@"Hello"];

   [myString release];
   [pool release];
}

Meine Frage ist Objekte im Besitz im Rahmen des Autofreigabepool Bedarfs der speziell relased wird oder ist die gesorgt, wenn der autorelasepool freigegeben wird worden?

Teo

War es hilfreich?

Lösung

Autorelease Pool Griffe die Autoreleased Objekte. Wenn Sie ein Objekt besitzen (über alloc oder zu kopieren oder zu halten), dann müssen Sie ihn freigeben. Also Ihr zweites Beispiel ist nicht korrekt. Wie Sie die Zeichenfolge zugewiesen haben, besitzen Sie es und Sie müssen es lösen.

Ein Autofreigabepool wird für den Haupt-Thread erstellt. (Sie können die Hauptfunktion prüfen, wenn Sie möchten). Jeder Thread benötigen einen eigenen Autofreigabepool Autoreleased Objekte zu verwalten. Deshalb, wenn Sie einen anderen Thread erstellt werden, dann müssen Sie ein Autofreigabepool für diesen Thread erstellen. Auch wenn Sie nicht Autoreleased Objekt im Thread erstellen Sie, sollten Sie dies als die Bibliotheksaufrufe in diesem Thread erstellen können Autoreleased Objekte erstellen. Auch wenn Sie sicher sind, dass keine Bibliothek Anrufe Autoreleased Objekte machen, dann sollten Sie sie auch erstellen, wie, dass die beste Praxis ist, besonders, wenn Sie auf großes Projekt arbeiten, die von mehreren Personen entwickelt und gepflegt wird.

Andere Tipps

Sie müssen nur Ihren eigenen Autofreigabepool erstellen, wenn Sie eine Reihe von erstellen Autoreleased Objekte, die Sie sammeln sofort Müll wollen. Allerdings sind Sie richtig, dass Sie keine „Autoreleased“ Objekte verweisen möchten Sie erstellen, nachdem Sie den Pool freigeben. Autoreleased Objekte (die Sie nicht behalten) zerstört werden, wenn der Pool abgelassen wird.

Da keines der Objekte in Ihrem Beispiel Autoreleased sind, Ihren eigenen Autofreigabepool schafft, ist im Wesentlichen ein no-op.

Weder Ihre Beispiele braucht einen Autofreigabepool. Autorelease-Pools nur kümmern Autoreleased Objekte:

NSArray *foo = [NSArray array];
NSObject *bar = [[[NSObject alloc] init] autorelease];

Ihre erste Zeichenfolge initialisiert eine Stringliteral mit und ist daher wohl besondere in Bezug auf die Speicherverwaltung (vielleicht jemand anderes weiß mehr). Ihre zweite Saite Lecks, wird der Pool nicht einen Unterschied machen. Ihre dritte Saite korrekt freigegeben, wieder der Pool macht keinen Unterschied machen.

Dies ist, wo Sie einen Pool brauchen würden:

- (void) someMethodThatRunsOnAThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *foo = [@"foo" uppercaseString];
    [pool drain];
}

Hier ist die foo Zeichenfolge würde auslaufen, wenn der Pool nicht da ist. Beachten Sie, dass ich drain statt release auf der Pool-Aufruf -. Auf iOS gibt es keinen Unterschied, aber in der Garbage Collection Umgebungen die beide unterscheiden, so besser ist es wahrscheinlich in der Gewohnheit, von dem richtigen Aufruf

Beachten Sie auch, dass Sie sogar einen Pool brauchen, obwohl Sie nicht Autorelease jede Objekte selbst, irgendwo da viele Speicheroperationen getan im Code sein könnte Sie in Ihrer Methode sind aufgerufen wird.

Denken Sie, dass dies etwas so sein sollte:

-(void) doSomething {

   NSAutorelease *pool = [[NSAutorelasepool alloc] init];


   NSString *myString = [[[NSString alloc] initWithString:@"Hello"] autorelease];

   // or create string like this (automatically autoreleased)
   NSString *myString = [NSString stringWithString:@"Hello"];

   [pool release];
}

Sie müssen Autorelease-Nachricht senden, um Objekte innerhalb Autofreigabepool. Sie werden freigegeben, wenn Freigabenachricht an Pool gesendet wird.

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