NSString stringWithFormat返回类型,为什么它是“id”?

为什么方法[NSString stringWithFormat]返回id类型? 从我期望的名称,它返回NSString ,而不是通用指针。 其他课程遵循这个“规则”。 例如, [NSNumber numberWithInt]返回NSNumber ,而不是id

我认为从工厂方法这样的事实来说甚至都不合理。

你提到NSNumber ,它没有任何直接的子类,所以它对numberWithInt:是安全的numberWithInt:返回一个NSNumber*

NSString* (和其他类,如NSSet )返回类型id因为它们可以有子类(分别是NSMutableStringNSMutableSet ),它们将inheritance此方法。 因此,这些inheritance的调用需要返回子类的类型的实例,并且由于方法命名的规则,您不能仅基于返回类型进行重载。 因此,他们需要一个共同的类型,这是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。