2010-02-03 6 views
8

Y a-t-il quelque chose comme les jets de sécurité C++ dans Objective-C?Coulée sûre dans l'objectif C

Je sais qu'ils sont en Objective C++, mais je ne suis pas sûr au sujet des effets secondaires possibles. L'utilisation d'Objective C++ peut ralentir le temps de compilation - y a-t-il d'autres raisons de ne pas l'utiliser?

+0

Quelle a été l'erreur, et quel était le casting? Si la distribution était en train de convertir un objet en un type différent (c'est-à-dire de 'id' en' NSString * '), cela peut affecter la manière dont le compilateur choisit quel sélecteur utiliser s'il y a plusieurs sélecteurs avec des signatures différentes. – dreamlax

+2

Vous ne pouvez pas utiliser 'dynamic_cast' dans ce cas (la cible n'est pas un pointeur ou une référence à ** class **). Utilisez 'static_cast' à la place. – kennytm

+0

@KennyTM: Merci, il fixe maintenant – Casebash

Répondre

9

Objective-c possède des distributions sécurisées C++. Sinon, nous pouvons utiliser la réflexion d'exécution:

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

Références:

Cocoa with Love:

+5

La conversion de id myObj en MyClass * est redondante. Les identifiants peuvent être assignés librement à des variables de n'importe quel type d'objet. – christosc

+0

"Objective-c a des distributions sûres C++". Que voulez-vous dire? par exemple. dynamic_cast ou alors? Il ne compile pas. Merci – sergtk

-1

Selon vous, quelle fonctionnalité de C++ va vous aider à lancer un long 64 bits vers un int 32 bits?

+0

non signée Dans de nombreuses implémentations du compilateur 'long' est même sur la cible 64 bits 32 bits. Et 'long long' est 64 bits. – kennytm

+1

Pas dans unix ou OS X. Le compilateur devrait vous donner un bon avertissement à ce sujet. – Darren

+0

Cela aurait dû être un commentaire - pas une réponse. Le casting était une erreur - je crois que j'aurais reçu un avertissement si j'utilisais un cast en C++ – Casebash

0

Vous pouvez activer les indicateurs du compilateur pour vous avertir dans les cas de ce type. Cette erreur particulière serait interceptée par le drapeau -Wconversion.

+0

-Wconversion semble manquer l'erreur et soulever beaucoup d'erreurs parasites au lieu – Casebash