2015-07-04 18 views
6

Sto cercando di creare un percorso (CGMutablePath) da utilizzare per un nodo di forma in SpriteKit (SKShapeNode). Sto eseguendo il mio codice e si ferma e dice EXC_BREAKPOINT come se ci fosse un punto di interruzione nel compilatore, quando non ce n'è uno. Di seguito è uno screenshot di quello che ho.Che succede con l'eccezione del breakpoint strano in Swift?

Screenshot

Come potete vedere, non ho alcun punto di interruzione impostato nel compilatore. Si tende appena a stop alla riga 31. C'è niente nei registri che forniscono un motivo per questo arresto anomalo, se ce n'era uno per iniziare.

Sono abituato a Objective-C di arresto in main.m con Thread 1: SIGABRT ed un NSException nel registro, ma questo solo non ha senso. Qualcuno può spiegare cosa c'è che non va?

MODIFICA: qui ci sono altri screenshot per dimostrare che non ho impostato alcun punto di interruzione. Quando ottengo un'eccezione, semplicemente lancia un breakpoint.

Console log

UI

+1

L'elenco di punti di interruzione (o 'br l') indica anche che non è stato impostato alcun punto di interruzione? –

+1

Avete interruzioni su tutti i punti di interruzione delle eccezioni? Questa sembra un'eccezione. –

+0

L'elenco dei punti di interruzione nell'area sinistra indica "Nessun punto di interruzione". – DDPWNAGE

risposta

6

Tale eccezione avviene perché arc4random() ritorni UInt32 e si stanno sottraendo un valore di tale, che possa causare un valore negativo, che non è rappresentabile come intero senza segno.

Per risolvere questo problema è possibile che si desideri lanciare l'espressione di Int32, prima sottraendo:

var y = CGFloat(self.size.height/3) + CGFloat((Int32)(arc4random() % 100) - 50) 

quanto riguarda il valore x sopra - si crea CGFloat e sottrarre solo dopo che e quindi non incontra la situazione di cui sopra. Quindi una soluzione diversa sarebbe la seguente

var y = CGFloat(self.size.height/3) + CGFloat(arc4random() % 100) - 50 

Devi fondamentalmente per garantire che nel punto in cui si sottrae qualcosa non avete tipo unsigned presente.

La cosa fastidiosa di questo è che il compilatore non avviserà e il codice funziona davvero a volte, ogni volta in cui arc4random restituisce qualcosa di più grande di 50 e quindi non alla deriva nei valori negativi ...

Incorporando il feedback e il suggerimento che non si dovrebbe usare arc4random % something la soluzione migliore sarebbe quella di utilizzare arc4random_uniform.

arc4random % something non produce una distribuzione corretta dei valori casuali, mentre arc4random_uniform(something) - this has already been discussed on SO before.

Una nota finale: probabilmente dovresti scegliere 101 come limite superiore anziché 100 perché sia ​​arc4random che arc4random_uniform producono un valore compreso tra 0 e (1 superiore), ad es. 0 e 99. Se sottraggo 50 ottieni un valore compreso tra -50 e +49. Scegliendo 101 si otterrà l'intervallo desiderato da -50 a +50.

var y = CGFloat(self.size.height/3) + CGFloat(arc4random_uniform(101)) - 50 
+0

Il casting di 'arc4random()' su un 'Int32' ha funzionato per me. Tuttavia, perché direbbe solo "EXC_BREAKPOINT?" – DDPWNAGE

+0

@DDPWNAGE non ho idea del motivo per cui ti dà un errore così strano. Non accade in fase di compilazione, accade in fase di esecuzione - non ho idea di quale sarebbe il messaggio di errore "corretto" o migliore. – luk2302

+3

@DDPWNAGE Vedi http://stackoverflow.com/questions/2611607/are-exc-breakpoint-sigtrap-exceptions-caused-by-debugging-breakpoints. 'EXC_BREAKPOINT' non è causato da punti di interruzione. È solo un incidente. Probabilmente un'eccezione sollevata. – Sulthan