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

时间:2012-11-07 21:52:43

标签: ios nsstring static-methods stringwithformat

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

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

2 个答案:

答案 0 :(得分:6)

您提到NSNumber,这没有任何直接的子类,因此numberWithInt:返回NSNumber*

是安全的

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

答案 1 :(得分:5)

因为它是类NSString上的静态方法,并且假定它返回被调用对象的类型。这也取决于类型,因为它可以来自NSMutableString。