我如何转换NSMutableArray到NSArray在objective-c?


当前回答

NSArray *array = mutableArray;

这个[mutableArray copy]反模式在示例代码中随处可见。停止这样做的一次性可变数组是瞬态的,并在当前作用域的末尾被释放。

运行时无法优化对即将超出作用域的可变数组的浪费复制,将其降为0并永久释放。

其他回答

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中有新的数据类型Array。使用let关键字声明数组,它就会变成NSArray,如果使用var关键字声明数组,它就会变成NSMutableArray。

示例代码:

let newArray = oldArray as Array

在objective-c中:

NSArray *myArray = [myMutableArray copy];

用swift:

 var arr = myMutableArray as NSArray

NSMutableArray是NSArray的一个子类,所以你并不总是需要转换,但如果你想确保数组不能被修改,你可以根据你是否希望它自动释放来创建一个NSArray:

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

/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];

编辑:由Georg Schölly提供的解决方案是一种更好的方式,而且非常干净,特别是现在我们有了ARC,甚至不需要调用autorelease。

NSArray *array = [mutableArray copy];

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

如果你不使用垃圾收集或ARC记住-copy保留对象。

我在swift 3中搜索答案,这个问题被显示为搜索的第一个结果,我从中得到了答案的灵感 这是swift 3的代码

let array: [String] = nsMutableArrayObject.copy() as! [String]