2010-02-03 15 views
8

¿Hay algo así como los moldes seguros de C++ en Objective-C?Safe casting in Objective C

Sé que están en el Objetivo C++, pero no estoy seguro de los posibles efectos secundarios. Usar Objective C++ puede ralentizar el tiempo de compilación, ¿hay alguna otra razón para no usarlo?

+0

¿Cuál fue el error, y lo que era el reparto? Si el elenco estaba transfiriendo un objeto a un tipo diferente (es decir, de 'id' a' NSString * '), puede afectar la forma en que el compilador elige qué selector usar si hay más de un selector con firmas diferentes. – dreamlax

+2

No puede usar 'dynamic_cast' en este caso (el objetivo no es puntero ni referencia a ** clase **). Use 'static_cast' en su lugar. – kennytm

+0

@KennyTM: Gracias, lo arreglé ahora – Casebash

Respuesta

9

Objective-c tiene modelos seguros de C++. Alternativamente, se puede utilizar el tiempo de ejecución de reflexión:

id myOb=[someObject getObject]; 
NSAssert([myOb isKindOfClass:[MyClass class]], @"Return value is not of type MyClass as expected."); 
MyClass * newOb= (MyClass *)myOb; 

Referencias:

Cocoa with Love:

+5

La transmisión de id myObj a MyClass * es redundante. Los Ids se pueden asignar libremente a variables de cualquier tipo de objeto. – christosc

+0

"Objective-c tiene modelos seguros de C++". ¿Qué quieres decir? p.ej. ¿dynamic_cast más o menos? No compila Gracias – sergtk

-1

¿Qué función de C++ crees que te ayudará a convertir un long de 64 bits en un int de 32 bits?

+0

En muchas implementaciones del compilador 'long' es de 32 bits, incluso en el destino de 64 bits. Y 'long long' es de 64 bits. – kennytm

+1

No en Unix o OS X. El compilador debería darle una buena advertencia al respecto. – Darren

+0

Esto debería haber sido un comentario, no una respuesta. El casting fue un error. Creo que habría recibido una advertencia si usaba un molde de C++. – Casebash

0

Puede activar los indicadores del compilador para avisarle en casos como este. Este error en particular sería atrapado por el indicador de -Wconversion.

+0

-La conversión parece omitir el error y generar muchos errores espurios en su lugar – Casebash