In der Entwicklerdokumentation, heißt es:Der beste Weg, um den Autorelease-Pool auf einem lang laufenden Hintergrund Thread regelmäßig zu entleeren?
Wenn Ihre Anwendung oder Thread erzeugt, viele Autoreleased Objekte langlebig und potenziell ist, sollten Sie in regelmäßigen Abständen ablaufen und Autorelease-Pools erstellen (wie das Application Kit auf der Haupt tut Faden); Andernfalls sammeln sich automatisch freigegebene Objekte an und Ihr Speicherbedarf wächst. Wenn Ihr unabhängiger Thread jedoch keine Cocoa-Aufrufe ausführt, müssen Sie keinen Autorelease-Pool erstellen.
Ich fragte mich, was der beste Weg, dies zu tun ist. Ich habe mehrere Methoden, von denen ich denke, dass sie funktionieren würden, aber ich weiß nicht, welche die "Besten" sind. Im Moment habe ich eine Methode, die den Thread starten und hält sie warten auf Operationen durchführen zu:
- (void)startThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
accessoryRunLoop = [NSRunLoop currentRunLoop];
//Add a dummy port to avoid exiting the thread due to no ports being found
[accessoryRunLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
while(accessoryThreadIsRunning)
{
//Keep the thread running until accessoryTheadIsRunning == NO
[accessoryRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
[pool release];
}
Meine Optionen, die ich denken kann, ist:
1) einen Zähler in der while (accessoryThreadIsRunning) hinzufügen, so dass Alle 50 oder 100 Mal wird der Autorelease Pool geleert und ein neuer erstellt.
2) Jedes Mal, wenn ich eine Methode in diesem Thread ausführe (mit performSelector: onThread :), kann ich einen Autorelease-Pool erstellen und ihn dann am Ende der Methode freigeben.
3) Erstellen Sie einen Timer, so dass ein Pool entleert und dann periodisch erstellt wird.
Ich denke, dass Option 1 ist die beste, aber würde gerne wissen, ob es eine andere Art und Weise, die ich tun sollte. Vielen Dank!
ich denke, es gab in wwdc 10 darüber reden – RolandasR