這兩行代碼之間沒有區別;它純粹是文體。
這裏的方法objectForKey:
返回一個類型爲id
的對象,它是一個通用對象指針。在Objective-C中,id
可以隱式轉換爲任何Objective-C對象類型而無需強制轉換。下面的兩行是等效的:
id someId = ...;
NSString *someString = someId; // #1
NSString *someString = (NSString *)someId; // #2
這類似於如何在C,void*
類型的指針可以隱式轉換的指針的任何其它類型不進行強制轉換(即也目標C的真,但在Objective-C中不鼓勵使用void*
指針;即在C++中爲而不是爲真)。
就類型安全而言,兩者都相當不安全。如果該對象的運行時類型實際上是您要將其轉換爲的類型(不管該類型是明確的還是隱式的)或其子類,那麼一切都將按預期工作。如果運行時類型是而不是您期待的內容,那麼最有可能的是NSException
將與普通的object does not response to selector
錯誤一起拋出,這是由於調用了該類型不存在的函數。由於訪問不存在或具有意想不到的值的ivar(因爲該對象實際上不是該類型),您可能會因分段錯誤而崩潰。
如果你不確定該對象的運行時類型的,應檢查其運行時類型與-class
或-isKindOfClass: methods, and then only take action if it's a particular type. Prefer using
-isKindOfClass:`,因爲這仍與子類的工作,而不是爲準確平等類與特定的比較類。例如:
id someId = ...;
if ([someId isKindOfClass:[NSString class])
{
// It's an NSString
NSString *someString = someId;
// Do stuff with someString...
}
非常感謝您的詳細說明。 –