Ihre App wird genau dort unterbrochen, wo der Moment ist, an dem die CPU aktuell Code Ihrer App ausführt. Ihre App erhält ständig Ausführungszeit durch den Taskplaner, der entscheidet, welche App CPU-Zeit bekommt, auf welchem Kern und für wie lange. Sobald das System wirklich schlafen geht, gibt der Scheduler einfach keine Zeit mehr für Ihre App, so wird es die Ausführung stoppen, wo immer es in diesem Moment ist, was ziemlich überall passieren kann. Der Kernel muss jedoch in einem sauberen Zustand sein. Das bedeutet, wenn Sie gerade einen Aufruf in den Kernel gemacht haben (viele libC-Funktionen tun dies) und dieser Aufruf ist nicht an einem sicheren Punkt (z. B. schlafen, warten auf eine Bedingung, etc.) oder möglich halten kritische Kernel-Sperren (z Trichter), kann der Kernel den Ruhezustand unterbrechen, bis dieser Aufruf zum Benutzerbereich zurückkehrt oder die Ausführung einen solchen sicheren Punkt erreicht, bevor er schließlich Ihre Anwendung vom Aufgabenplaner löscht.
Sie können einen Kernel-Port öffnen und sich für Sleep/Wake-up-Ereignisse registrieren. In diesem Fall erhält Ihre App ein Ereignis, wenn das System in den Ruhezustand wechseln möchte. Sie haben mehrere Möglichkeiten.Einer besteht darin, darauf zu antworten, dass das System fortschreiten kann. Ein anderes ist Schlaf auszusetzen; Apple sagt jedoch, dass bestimmte Ereignisse bis zu 30 Sekunden lang ausgesetzt werden können. Danach wird das System einfach fortgesetzt, unabhängig davon, ob Ihre App es mag oder nicht. Und schließlich können Sie es abbrechen; Es können jedoch nicht alle Ereignisse storniert werden. Wenn das System bereits entschieden hat, dass es schlafen geht, können Sie es nur um höchstens 30 Sekunden unterbrechen oder es auf einmal zulassen, Sie können es nicht abbrechen. Sie können jedoch auch ein Ereignis anhören, bei dem das System nach Apps fragt, ob es in Ordnung ist, jetzt in den Ruhezustand zu wechseln, und Sie können dort mit "Nein" antworten, wodurch ein Ruhezustand abgebrochen wird. Der Unterschied zwischen "Ist es okay zu schlafen" und "Ich plane ins Bett zu gehen" ist: Der erste wird gesendet, wenn die Energiespareinstellungen angewendet werden, das heißt, wenn der Benutzer das nicht bewegt hat Maus oder getippt für die dort konfigurierte Zeit. In diesem Fall fragt das System nur, ob der Schlaf in Ordnung ist. Eine App wie Apples DVD-Player wird "Nein" sagen, weil der Benutzer höchstwahrscheinlich eine DVD anschaut und somit nicht mit dem Computer interagiert, noch immer keinen Grund zum Einschlafen. OTOH, wenn der Benutzer sein Mac Book schließt, werden die Apps nicht gefragt, das System geht sicher schlafen und informiert nur Apps, die jetzt bis zu 30 Sekunden haben, um darauf zu reagieren.
Wake-up-Ereignisse können auch ziemlich interessant zu fangen sein. Z.B. Wenn Ihr System aufwacht, sind möglicherweise keine offenen Dateien verfügbar (ein externes Laufwerk wurde entfernt) oder Netzwerk-Sockets funktionieren nicht mehr (Netzwerk hat sich geändert). So können Sie bestimmte App-Teile neu initiieren, bevor Sie sie verwenden und mehr oder weniger erwartete Fehler verursachen.
Apple's page regarding catching these events.
Aber es wäre das Betriebssystem zu beantragen, dass die App selbst aussetzt zwingt sie nicht beispiellos für, dann, wenn es nicht in einer bestimmten Menge an Zeit der Fall ist. So dürfen gute Bürger aufräumen und schlechte Bürger dürfen keine Probleme machen. – benzado