I ragazzi di C++ e Java mi dicono sempre che le eccezioni non costano nessuna prestazione a meno che non vengano lanciate. Lo stesso vale per Objective-C?
Risposta breve
Solo nel 64-bit OS X e iOS.
Non sono completamente gratuiti. Per essere più precisi, il modello è ottimizzato per minimizzare i costi durante l'esecuzione regolare (spostando le conseguenze altrove).
Risposta dettagliata
su 32 bit OS X e iOS, le eccezioni hanno runtime costa, anche se non sono gettati. Queste architetture non utilizzano Eccezioni costo zero.
Con OS X a 64 bit, ObjC è passato a prendere in prestito le "Eccezioni di costo zero" del C++. Le eccezioni di costo zero hanno un overhead di esecuzione molto molto basso, a meno che non siano state generate. Le eccezioni di costo zero spostano in modo efficace il costo di esecuzione in dimensioni binarie. Questo è stato uno dei motivi principali per cui inizialmente non erano stati utilizzati in iOS. L'abilitazione di eccezioni C++ e RTTI può aumentare le dimensioni binarie di oltre il 50% - naturalmente, mi aspetto che questi numeri siano molto più bassi in ObjC puro semplicemente perché c'è meno da eseguire quando si srotolano.
In arm64, il modello di eccezione è stato modificato da Salto in lungo salto Salto a Eccezioni di costo zero derivate da Itanium (a giudicare dal gruppo).
Tuttavia, programmi Idiomatic objc non sono scritte o preparati per recuperare da eccezioni, così si dovrebbe prenotare il loro uso per situazioni che non si intende recuperare da (se si decide di utilizzare affatto). Maggiori dettagli in Clang manual on ARC e in altre sezioni della pagina di riferimento.
Sono piuttosto sicuro che i ragazzi del C++ di solito vi dicano che i costi delle eccezioni sono * trascurabili * a meno che non vengano lanciati. –