为什么方法[NSString stringWithFormat]
会返回id
类型?从我期望的名称,它返回NSString
,而不是通用指针。其他课程遵循这个“规则”。例如,[NSNumber numberWithInt]
会返回NSNumber
,而不是id
。
我认为,从工厂方法这样的事实来看,它甚至都不合理。
答案 0 :(得分:6)
您提到NSNumber
,这没有任何直接的子类,因此numberWithInt:
返回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:@[]];
答案 1 :(得分:5)
因为它是类NSString上的静态方法,并且假定它返回被调用对象的类型。这也取决于类型,因为它可以来自NSMutableString。