这两行代码之间没有区别;它纯粹是文体。
这里的方法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...
}
非常感谢您的详细说明。 –