我如何将NSMutableArray转换为NSArray 目标?
NSArray *array = mutableArray;
我如何将NSMutableArray转换为NSArray 目标?
NSArray *array = mutableArray;
Answers:
NSArray *array = [mutableArray copy];
Copy
制作不可变的副本。这非常有用,因为Apple可以进行各种优化。例如,发送copy
到不可变数组仅保留对象并返回self
。
如果您不使用垃圾收集或ARC,请记住-copy
保留该对象。
copy
创建普通的NSArray而不是NSMutableArray?
NSArray
&NSMutableArray
,NSString
&NSMutableString
。但不是例如NSViewController
它总是包含可变状态。
An NSMutableArray
是的子类,NSArray
因此您不必总是进行转换,但是如果您要确保无法修改该数组,则可以NSArray
根据是否希望其自动发布来创建以下两种方式之一:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
编辑: GeorgSchölly提供的解决方案是一种更好的方法,而且更清洁,尤其是现在我们有了ARC,甚至不必调用自动发布。
我喜欢两种主要解决方案:
NSArray *array = [NSArray arrayWithArray:mutableArray];
要么
NSArray *array = [mutableArray copy];
我在其中看到的主要区别是,当mutableArray为nil时,它们的行为如何:
NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)
NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
[mutableArray copy]
因此可以简化为[nil copy]
。在Objective-C中,发送到nil的任何消息始终为nil。重要的是要记住“什么都没有”和“其中没有任何东西的数组”之间的区别。
您尝试此代码-
NSMutableArray *myMutableArray = [myArray mutableCopy];
和
NSArray *myArray = [myMutableArray copy];
下面是将NSMutableArray转换为NSArray的方法:
//oldArray is having NSMutableArray data-type.
//Using Init with Array method.
NSArray *newArray1 = [[NSArray alloc]initWithArray:oldArray];
//Make copy of array
NSArray *newArray2 = [oldArray copy];
//Make mutablecopy of array
NSArray *newArray3 = [oldArray mutableCopy];
//Directly stored NSMutableArray to NSArray.
NSArray *newArray4 = oldArray;
在Swift 3.0中,有一个新的数据类型Array。使用let
关键字声明Array ,它将变为NSArray;如果使用var
关键字声明,则将变为NSMutableArray。
样例代码:
let newArray = oldArray as Array
NSArray *array = mutableArray;
此[mutableArray copy]
反模式是所有示例代码。停止这样做是为了暂时丢弃并在当前作用域的末尾重新分配的一次性可变数组。
运行时无法优化即将超出范围,可变为0并永久释放的可变数组的无用复制。
NSMutableArray
一个NSArray
变量不会隐蔽它(这是OP的问题是关于什么的)。如果该值意外突变,则暴露这样的值(例如,作为返回值或作为属性)可能会导致很难调试的问题。由于可变值是共享的,因此这适用于内部和外部突变。
NSMutableArray
变量就足够了。由于对象从未停止过成为可变数组,因此对其调用变异方法将成功并变异共享数据。另一方面,如果将原始的可变数组复制(将其更改为不可NSMutableArray
变数组),然后分配给变量并调用了mutation方法,则这些调用将失败并doesNotRespondToSelector
出错,因为接收到mutating方法调用的对象位于事实是不可变的,并且不响应这些方法。
如果要通过可变性构造一个数组,然后要返回一个不变的版本,则可以通过继承简单地将可变数组作为“ NSArray”返回。
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
如果您“信任”调用方将(技术上仍然可变的)返回对象视为不可变的NSArray,则这是比便宜的选择[mutableArray copy]
。
为了确定它是否可以更改接收到的对象,消息的接收者必须依赖于返回值的形式类型。例如,如果它收到类型为不可变的数组对象,则不应尝试对其进行突变。根据对象的类成员资格确定对象是否可变是不可接受的编程习惯。
上述做法将在此处详细讨论:
NSArray *array = [mutableArray copy];