2010-02-03 58 views
8

Objective-C中是否有类似C++的安全铸造?我知道它们在Objective C++中,但我不确定可能产生的副作用。使用Objective C++可能会减慢编译时间 - 是否有其他原因不使用它?目标C中的安全铸造

+0

什么是错误的,什么是演员?如果演员将对象转换为其他类型(即从'id'到'NSString *'),则可能会影响编译器如何选择使用哪个选择器(如果有多个具有不同签名的选择器)。 – dreamlax 2010-02-03 05:16:11

+2

在这种情况下,您不能使用'dynamic_cast'(目标不是指向**类**的指针或引用)。改用'static_cast'。 – kennytm 2010-02-03 06:09:41

+0

@KennyTM:谢谢,现在修复它 – Casebash 2010-02-03 06:55:46

回答

9

Objective-c确实拥有C++安全的强制转换。或者,我们可以使用运行时反射:

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

参考文献:

Cocoa with Love

+5

将id myObj投射到MyClass *是多余的。可以将ID自由分配给任何对象类型的变量。 – christosc 2012-01-31 18:01:07

+0

“Objective-c确实拥有C++安全模式”。你什么意思?例如dynamic_cast左右?它不会编译。谢谢 – sergtk 2013-05-17 22:39:13

-1

您认为C++的哪些功能将帮助您将64位的long转换为32位的int

+0

在许多编译器实现中,即使在64位目标上,long也是32位。而'long long'是64位。 – kennytm 2010-02-03 07:06:47

+1

不在unix或OS X中。编译器应该给你一个很好的警告。 – Darren 2010-02-03 07:16:59

+0

这应该是一个评论 - 不是答案。该投射是一个错误 - 我相信如果我使用C++转换,我会收到警告 – Casebash 2010-02-03 09:54:42

0

你可以打开编译器标志来警告你这种情况。这个特殊的错误会被-Wconversion标志所捕获。

+0

-Wconversion似乎错过了错误,并提出了很多虚假错误 – Casebash 2010-02-03 22:51:23