Was bedeutet "Autoreleased ohne Pool"?

8

Meine Anwendungsstruktur lautet wie folgt: der Kernteil ist in C ++ geschrieben und verwendet Thread stark, und ich entwickle UI in Objective C darüber, Wenn ich den Thread nicht ausführen, funktioniert es gut, aber ich kann nicht deaktivieren, Thread stoppen, UI stürzt zufällig im Protokoll, das ich sehen konnte, folgende Nachricht

%Vor%

Ähnliche Nachrichten, die mehr als einmal kommen, durch googling zu wissen, ich muss NSAutoReleasePool setzen, um es loszuwerden, aber wie es möglich ist, das gleiche mit C ++ - Code zu integrieren.

Bearbeiten: Core lib wird von der UI aus aktiviert, daher kann man sagen, dass UI im Hauptthread läuft, Lib erstellt / beendet Thread, ohne UI zu benachrichtigen, In diesem Fall kann ich AutoReleasePool in der Benutzeroberfläche

aufrufen

Kann mir jemand helfen?

    
Amitg2k12 22.01.2011, 15:49
quelle

2 Antworten

7

Sehen Sie in diesen Dokumenten nach, was Sie über das Multithreading mit Cocoa wissen sollten: Ссылка

Es ist in Ordnung, Ihre App so zu gestalten, wie Sie sie haben, aber zwei Dinge sollten Sie beachten:

  1. Das Leben ist am einfachsten (und manchmal notwendig), wenn UI-Steuerelemente wie Ansichten (AppKit oder UIKit) im Hauptthread bearbeitet werden. Sie können Foundation-Objekte und einige AppKit / UIKit-Objekte in Hintergrundthreads verwenden, und einige Foundation-Objekte können aus mehreren Threads verwendet werden.
  2. Wenn Sie überhaupt Cocoa-Objekte in Hintergrundthreads verwenden, müssen Sie für diese Threads automatische Freigabepools einrichten.

Wie so:

%Vor%

Das wird Ihre Konsolenfehler beheben, aber Sie haben möglicherweise andere Probleme, die zu dem tatsächlichen Absturz geführt haben, den Sie gesehen haben.

    
Ben Zotto 22.01.2011, 15:59
quelle
1

Es bedeutet, dass Sie etwas ohne Autorelease-Pool automatisch freigegeben haben.

Jeder Thread hat einen Stapel von Autorelease-Pools. Im Hauptthread wird ein Autorelease-Pool für Sie erstellt, bevor Cocoa zu Ihrem Code aufruft und nach Rückgabe des Codes gelöscht wird. Jedes Objekt, das Sie (explizit oder implizit) automatisch freigeben, wird in den Pool aufgenommen, damit der Pool es freigibt, wenn der Pool ausgelaufen ist. Wenn Sie einen Thread erstellen, müssen Sie einen Autorelease-Pool für diesen Thread selbst erstellen und löschen. (Oder einfach nicht Autorelease, aber das ist praktisch unmöglich für eine sinnvolle Menge an Code.)

Wenn Sie sich jemals dazu entschließen, Ihren Code unter "garbage-collection" auszuführen, müssen Sie den Pool drain , nicht release senden, wenn Sie damit fertig sind, damit der Pool nützlich ist. Wenn der GC aktiviert ist, tun die Meldungen release und autorelease nichts - sie werden nicht einmal ausgeführt. Ihr Autorelease-Pool reagiert auf drain , indem er den Garbage Collector anstößt, was dem Freigeben der Objekte am nächsten kommt, die im Pool gewesen wären.

Das Memory Management Programming Guide für Cocoa enthält weitere Informationen zu Autorelease-Pools. unter anderem.

    
Peter Hosey 23.01.2011 11:20
quelle