这个NSMutableArray alloc& init如何工作?

时间:2013-12-13 08:09:19

标签: ios objective-c

我在一个项目中看到了一种新的alloc&amp; init NSMutableArray方式。这就像 A NSMutableArray *array = [@[] mutableCopy];并且效果很好,我想尝试是否可以使用 B NSMutableArray *array = [NSMutableArray mutableCopy];构建成功,但在使用时遇到此错误:+[NSMutableArray addObject:]: unrecognized selector sent to class 0x38bedc2c < / p>

现在我想知道A是如何工作的?为什么B错了? A比普通的alloc&amp; init好吗? 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

mutableCopyNSObject类中声明的实例方法。在任何实例上调用它来创建它的可变副本。

在第一种情况下,@[]将创建一个自动释放的NSArray实例,在该实例上调用mutableCopy将创建NSMutableArray实例。

在第二种情况下,对类调用mutableCopy是不正确的,因为它不是那种方式调用的。这将被编译,但会在运行时导致异常。 希望有所帮助!

答案 1 :(得分:1)

在第一种情况下,您首先要初始化一个空的NSArray实例;认为@[]等同于[[NSArray alloc] init]。因此,您将mutableCopy发送到正确的实例,因此它可以正常工作。

在第二种情况下,您将消息发送到类(而不是它的实例),这没有多大意义,因为addObject消息只能发送到实例而不是班级本身。

答案 2 :(得分:1)

第一个是懒惰打字。
你应该避免它。 它从数组文字语法创建一个空的NSArray,并创建一个可变副本。 这通过创建一个不必要的数组节省了一点点打字。

你应该使用 [NSMutableArray新] 要么 [[NSMutableArray alloc] init] 或者,如果可能,因为您事先知道初始容量 [[NSMutableArray alloc] initWithCapacity:someNSUIntegerValue]

上面的任何其他内容都是懒惰。 实际复制某些内容时,只能使用mutableCopy。

答案 3 :(得分:0)

@[]表示没有对象的NSArray。它返回NSArray,然后将其mutableCopy复制到array

+[NSMutableArray addObject:]无效,因为addObject是一个实例方法,并且您尝试将其用作类方法。

即使NSMutableArray *array = [NSMutableArray mutableCopy];也不正确!由于没有创建任何内容,因此未分配和引入。如果您记录该数组,它将只打印字符串NSMutableArray。此外,您无法使用array添加对象和其他操作。

您应该使用NSMutableArray *array = [NSMutableArray array];