2011-11-24 110 views
2

我在我的代码调试东西,认识到以下编译申报与实际类型,目标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 

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

+1

你真的在你的第一行中将Set设置为数组吗?还是这是一个错字? –

+0

当然这是一个错字,但问题是,为什么这个编译呢? –

+0

我也很好奇。所以我跑了一个快速测试。对于相同的代码,我得到1作为输出。你是怎么得到3的?确实set不会存储重复值,但这并不一定意味着你不能添加重复值。这是一个逻辑“错误”的问题,因此编译器不会抱怨。 –

回答

4

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

注意匹配类名是很重要的。

另见Marc Charbonneau here

+0

谢谢。非常有意义 –

2

[[NSMutableArray alloc] init]回报id作为@CocoaFu提到的答案。您将其分配给您声明为NSMutableSet的指针,因为返回的id而可以接受。像大多数其他语言一样,仅仅因为你宣称它是一个NSMutableSet就不会让它成为一个。

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

除了您的指针,您声明的代码中没有任何特定错误,因为声明不准确。