Objective c 目标C无法处理2d数组。计数?

Objective c 目标C无法处理2d数组。计数?,objective-c,arrays,Objective C,Arrays,我得到了最新的xcode,即xcode 4.6,但存在以下问题: NSArray *array = @[@[@"a",@"b"]]; NSLog(@"%d", array[0].count); 在我运行它之前,xcode告诉我“在“id”类型的对象上找不到属性“count” 但是如果我把它改成 NSLog(@"%d", [array[0] count]); 那么,一切都好了 所以我的问题是,为什么obj-c不能处理两个数组[index]。count?查看NSArray的文档。没有coun

我得到了最新的xcode,即xcode 4.6,但存在以下问题:

NSArray *array = @[@[@"a",@"b"]];
NSLog(@"%d", array[0].count);
在我运行它之前,xcode告诉我“在“id”类型的对象上找不到属性“count”


但是如果我把它改成

NSLog(@"%d", [array[0] count]);
那么,一切都好了



所以我的问题是,为什么obj-c不能处理两个数组[index]。count

查看
NSArray
的文档。没有
count
属性。实际上,
NSArray
根本没有属性


当您对非属性方法使用属性语法时,如果您有一个特定类型的对象,并且有一个同名的方法,编译器将正常处理它。但在本例中,您有一个
id
。因此,编译器无法安全地确定您访问
count
属性的尝试是否应转换为对
count
方法的调用。

您可以通过如下方式解决此问题:
NSLog(@“%d”,((NSArray*)数组[0]).count)。XCode将允许您调用对象不会响应的方法,因为它认为您知道自己在做什么。但是,如果找不到属性,它将出错。

那么,编译器将数组[0]视为id而不是NSArray?我是否应该停止使用。对每个NSArray进行计数以避免混淆?
objectAtIndex:
的返回值为
id
。当您使用现代语法
array[x]
时,这与
[array objectAtIndex:x]
相同。这就是为什么
array[0]
id
而不是
NSArray
的原因。