我在一个项目中看到了一种新的alloc& 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好吗? 任何帮助将不胜感激。
答案 0 :(得分:2)
mutableCopy
是NSObject
类中声明的实例方法。在任何实例上调用它来创建它的可变副本。
在第一种情况下,@[]
将创建一个自动释放的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];