【发布时间】:2013-02-21 07:23:57
【问题描述】:
我对一种奇怪的行为感到不安,如下例所示:
NSMutableArray *a1 = [[NSMutableArray alloc] init]; // fine
NSMutableArray *a2 = [NSMutableArray array]; // fine, too
// compiler reports incompatible pointer types; good:
NSMutableArray *a3 = [[NSArray alloc] init];
// compiler says nothing and is happy to assign this!
NSMutableArray *a4 = [NSArray array];
NSArray 和 NSMutableArray 类的 init 和 array 方法都返回 id。但是,当我调用这些方法时的行为根本就不一样,clang 让我很高兴地将一个空的NSArray 分配给一个NSMutableArray 变量!
事实证明clang will automatically change the return type of some methods, including the init family, to instancetype,因此能够在编译时确定[[NSArray alloc] init] 返回NSArray * 而不是NSMutableArray *。但是这个检查根本不适用于array 方法。
为什么?像我上一个示例这样的行不应该产生至少一个警告吗?为什么不是所有这些方法都声明为返回instancetype?以后会变吗?
更新
好消息:从 iOS 7 开始,[NSArray array] 返回 instancetype,因此上面对 a4 的赋值也会产生警告。 arrayWithContentsOfFile: 或 arrayWithContentsOfURL 等其他方法仍然返回 id,不过……
【问题讨论】:
-
我会在bugreport.apple.com 提交错误并在此处提及错误编号。
-
@ericgorr 问题是,这不是错误。
-
@Jean-PhilippePellet:对不起,我复制了你的问题...stackoverflow.com/questions/15249505/…
-
@AnoopVaidya 我想你误解了
id的用途。 -
错误报告 rdar://13357852
标签: objective-c cocoa clang