5

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

我认为从工厂方法之类的事实来看,这甚至是不合理的。

4

2 回答 2

6

您提到NSNumber,这没有任何直接子类,因此numberWithInt:返回 a是安全的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:@[]];
于 2012-11-07T21:59:56.127 回答
5

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

于 2012-11-07T21:55:39.673 回答