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
aufrufenKann mir jemand helfen?
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:
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.
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.
Tags und Links multithreading objective-c++ debugging cocoa