2010-02-03 62 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