为什么该方法[NSString stringWithFormat]
返回一个id
类型?从我期望的名称来看,它返回一个NSString
,而不是通用指针。其他类遵循这个“规则”。例如[NSNumber numberWithInt]
返回一个NSNumber
,而不是一个id
。
我认为从工厂方法之类的事实来看,这甚至是不合理的。
为什么该方法[NSString stringWithFormat]
返回一个id
类型?从我期望的名称来看,它返回一个NSString
,而不是通用指针。其他类遵循这个“规则”。例如[NSNumber numberWithInt]
返回一个NSNumber
,而不是一个id
。
我认为从工厂方法之类的事实来看,这甚至是不合理的。
您提到NSNumber
,这没有任何直接子类,因此numberWithInt:
返回 a是安全的NSNumber*
NSString*
(以及其他类,例如NSSet
)返回类型id
,因为它们可以有子类(NSMutableString
和NSMutableSet
分别),它们将继承此方法。因此,这些继承调用需要返回子类类型的实例,并且由于方法命名规则,不能仅基于返回类型进行重载。因此,它们需要一个共同的类型,即id
.
更新:最近的发展意味着关键字instancetype
现在可用。您可能已经注意到很多引用id
现在都替换为instancetype
. 该关键字向编译器提供了一个提示,即方法的返回类型与方法的接收者是同一类。
例如(我强调一个例子,在实际框架中可能并非如此):
NSArray:
- (instancetype)initWithArray:(NSArray*)array;
NSMutableArray:
// Inherits from NSArray
----
// Receiver is NSArray, method belongs in NSArray, returns an NSArray
[[NSArray alloc] initWithArray:@[]];
// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray
[[NSMutableArray alloc] initWithArray:@[]];
因为它是 NSString 类的静态方法,并且假定它返回被调用对象的类型。这也取决于类型,因为它可以来自 NSMutableString。