2010-06-23 9 views
8

Ho appena ricevuto l'iPhone SDK 4 e sto cercando di smettere di sviluppare un'app su cui stavo lavorando prima. Così ho implementato sia -(void)applicationDidEnterBackground:(UIApplication *)application e - (void)applicationWillTerminate:(UIApplication *)applicationL'app per iPhone che esegue Simulator 4.0 ha ricevuto Sigkill

Quando clicco il tasto home nel simulatore 4.0, sembra funzionare bene. L'app chiama -(void)applicationDidEnterBackground:(UIApplication *)application e passa allo stato di sfondo ..

Tuttavia, faccio quindi doppio clic sul pulsante Home per esporre l'app in esecuzione in background e tenerla premuta per mostrare il segno meno o per uscire. Perché quando clicco sul segno meno, il debugger dice

programma ha ricevuto il segnale: "SIGKILL"

in aggiunta, - (void)applicationWillTerminate:(UIApplication *)application non viene mai chiamato. Mi manca qualcosa che devo fare perché funzioni su OS4? O almeno qualcuno può indicarmi un modo per eseguire il debug di SIGKILL. Grazie.

risposta

13

-applicationWillTerminate: viene chiamato solo se l'applicazione è in uno stato in esecuzione quando viene chiesto di uscire. Se è già in uno stato sospeso (come lo avete qui), il sistema invia semplicemente un segnale di uccisione all'applicazione. Ciò accade quando l'utente preme i pulsanti rossi meno per terminare manualmente l'app e quando il sistema decide di scaricare l'app per liberare memoria per l'applicazione in primo piano.

Se applicazione è in esecuzione in background (la riproduzione di musica o l'esecuzione di alcune operazioni in background, per esempio) e l'utente termina manualmente l'applicazione premendo il pulsante di meno, solo allora si effettivamente ottenere un messaggio di -applicationWillTerminate:. Pertanto, è necessario salvare tutto il proprio stato/ecc. prima di tornare da -applicationDidEnterBackground:.

+0

Grazie per la risposta. Questo ha senso. Tuttavia, sto avendo anche un altro problema. Quando viene chiamato -applicationDidEnterBackground: cerco di salvare lo stato dell'app utilizzando NSUserDefaults, ma per qualche motivo i miei valori non sono quelli che mi aspetto che siano una volta riavviata l'app. Qualche ragione per cui questo non funzionerebbe in OS4? – NickDK

+0

Nevermind ... Non stavo chiamando sychronize su NSUserdefaults. – NickDK

2

Ci si può aspettare che la barra multitasking "pulsante di chiusura rosso" sia l'equivalente della chiusura forzata di un'applicazione su Mac OS X. Questo è il comportamento documentato. Apple si aspetta che i normali utenti di iOS 4 semplicemente lancino/usano/dimiss app che non devono pensare in termini di terminazione dei processi o altro. Il sistema lo gestirà.

Basta assicurarsi di salvare tutti i dati importanti nell'applicazione: willResignActive: o applicationWillEnterBackground. Perché dopo di ciò potresti essere ucciso quando la pressione della memoria costringe il sistema a ripulire ... Snow Leopard ha introdotto un comportamento simile per le app che utilizzano la chiave NSSupportsSuddenTermination nel proprio Info.plist. Un'app dice in sostanza al sistema che salva i suoi dati periodicamente bit per bit, così che quando va in background non c'è niente da fare o molto poco. A differenza delle app per desktop monolitiche più grandi ...