在Objective C中声明与实际类型

时间:2011-11-24 02:28:23

标签: objective-c

我在我的代码中调试了一些东西并意识到以下编译

NSMutableSet *s = [[NSMutableArray alloc] init];

Card *c = [[Card alloc] init];

[s addObject:c];
[s addObject:c];
[s addObject:c];

NSLog(@"Set now contains %d cards ", [s count]); //Prints 3

但声明的类型是这里的Set ..为什么允许重复?为什么要编译呢?

2 个答案:

答案 0 :(得分:4)

[[NSMutableArray alloc] init]返回类型id,这是Objective-C返回类型id的标准。在许多情况下,实际返回的类型取决于类的实现,许多Apple提供的类是类集群并返回不同的类型。一个常见的例子是NSString,其中通常返回类NSCFString的实例。

注意匹配类名非常重要。

另见Marc Charbonneau here

的答案

答案 1 :(得分:2)

[[NSMutableArray alloc] init]返回id,如@CocoaFu所述。您将其分配给声明为NSMutableSet的指针,由于返回id,该指针是可接受的。像大多数其他语言一样,仅仅因为你宣称它是一个NSMutableSet而不是一个。

由于NSMutableSetNSMutableArray都有一个名为-addObject:的方法,编译器不会发出有关被调用的未知方法的警告。

除了指针之外,您的代码中没有特定的错误,如声明的那样,是不准确的。