Domanda

Sto sviluppando un gioco che utilizza un controller diverso per ogni livello. È necessario rilevare una scossa tramite l'accelerometro, quindi si registra come delegato in questo modo:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = kUpdateInterval; 

Quando il livello si conclude, questo controller viene dealloc'd e liberato. In precedenza, mi è stato sempre un crash dopo questo controller è stato liberato perché non ho nulla fuori il delegato sul UIAccelerometer (vale a dire è stato ancora inviando gli eventi a un oggetto che ora è stato liberato). Così ora, all'interno di dealloc, sto facendo questo:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = nil;

tutto va bene e il bene e il primo livello svolge senza intoppi. Il problema si verifica quando arrivo al livello successivo, creare un nuovo controllore di livello ed eseguire tale primo lotto di codice nuovo (fissando il nuovo controllore ora come delegato). Dopo questo, io non ricevo nessuna chiamata dal accelerometro.

Quindi la domanda è, stai solo permesso di avere un delegato per ogni app per l'accelerometro, o sto solo perdendo qualcosa? Non ho visto nulla nella documentazione generale che non consente l'impostazione del delegato più volte. Sono un po 'una novità per Obj-C, ma per quanto ho capito delegati questo non dovrebbe essere troppo poco ortodosso.

Nota: So che in 3.0 ho potuto solo ascoltare le notifiche shake. Purtroppo, ho bisogno di qualcos'altro per essere il primo risponditore tutto il tempo mi sono interessato a tremare. Quindi non posso solo refactoring a tale opzione.

È stato utile?

Soluzione

In generale, gli oggetti che hanno i delegati hanno solo uno alla volta. Salvo diversamente documentato, non ci dovrebbe essere alcuna limitazione su come impostare più di un oggetto diverso come delegato per tutta la durata di una particolare istanza.

Mi chiedo se quello che sta succedendo è che il primo controller viene dealloced dopo si imposta il secondo controller come delegato acceleratore. Avete guardato il codice con il debugger per essere sicuri che questo accada di tutto nel modo che ci si aspetta?

Altri suggerimenti

Una possibile soluzione sarebbe quella di avere una classe diversa, forse la vostra applicazione delegato, agire come delegato del UIAccelerometer e hanno quella classe inviare personalizzato un NSNotification quando riceve il messaggio accelerometer:didAccelerate:. Si potrebbe o solo inviare il messaggio quando si rileva il tipo di accelerazione che ti interessano o si può inviare la notifica ogni volta e includere la paramter UIAcceleration come parte del notifiche userInfo. I suoi controllori che sono interessati a dati di accelerazione possono registrarsi per le notifiche, se necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top