如何将NSMutableArray转换为NSArray?

如何将NSMutableArray转换为Objective-C中的 NSArray?

 NSArray *array = [mutableArray copy]; 

Copy使不可变的副本。 这是非常有用的,因为苹果可以进行各种优化。 例如,将copy发送到不可变数组只保留该对象并返回self

如果您不使用垃圾回收或ARC,请记住-copy保留该对象。

一个NSMutableArrayNSArray一个子类,所以你不总是需要转换,但是如果你想确保数组不能被修改,你可以创build一个NSArray ,这取决于你是否希望它自动释放:

 /* Not autoreleased */ NSArray *array = [[NSArray alloc] initWithArray:mutableArray]; /* Autoreleased array */ NSArray *array = [NSArray arrayWithArray:mutableArray]; 

编辑:由格奥尔格Schölly提供的解决scheme是一个更好的方法,做得更干净,特别是现在我们有ARC,甚至不需要调用autorelease。

我喜欢两个主要的解决scheme:

 NSArray *array = [NSArray arrayWithArray:mutableArray]; 

要么

 NSArray *array = [mutableArray copy]; 

我看到他们的主要区别是他们如何performance当mutableArray是零

 NSMutableArray *mutableArray = nil; NSArray *array = [NSArray arrayWithArray:mutableArray]; // array == @[] (empty array) NSMutableArray *mutableArray = nil; NSArray *array = [mutableArray copy]; // array == nil 

你试试这个代码—

 NSMutableArray *myMutableArray = [myArray mutableCopy]; 

 NSArray *myArray = [myMutableArray copy]; 

在objective-c中:

 NSArray *myArray = [myMutableArray copy]; 

在迅速:

  var arr = myMutableArray as NSArray 

Objective-C的

下面是将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中有新的数据typesArray 。 使用let关键字声明数组,然后它将成为NSArray而如果声明使用var关键字,那么它成为NSMutableArray

示例代码:

 let newArray = oldArray as Array 

如果你是通过可变性构造一个数组,然后想返回一个不可变的版本,你可以通过inheritance简单地将可变数组作为“NSArray”返回。

 - (NSArray *)arrayOfStrings { NSMutableArray *mutableArray = [NSMutableArray array]; mutableArray[0] = @"foo"; mutableArray[1] = @"bar"; return mutableArray; } 

如果“信任”调用者将(技术上仍然可变的)返回对象视为不可变的NSArray,则这是比[mutableArray copy]更便宜的选项。

苹果同意:

要确定它是否可以更改接收的对象,消息的接收者必须依赖返回值的formstypes。 例如,如果它接收到一个types为不可变的数组对象, 它不应该试图改变它 。 根据类的成员资格来确定对象是否可变是不可接受的编程实践。

上面的做法在这里有更详细的讨论:

最佳实践:如果返回types是NSArray,则返回mutableArray.copy或mutableArray

我在swift 3search答案,这个问题被显示为search的第一个结果,我从中得到灵感的答案,所以这里是快速的3代码

 let array: [String] = nsMutableArrayObject.copy() as! [String] 
 NSArray *array = mutableArray; 

这个[mutableArray copy]模式遍布整个代码。 停止这样做的一次性可变数组是暂时的,并得到当前范围的结尾解除分配;

运行时没有办法优化那个刚刚超出范围的可变数组的错误的虚假的浪费的复制,递减到0并且释放好。