391

如何在中将 NSMutableArray 转换为 NSArray ?

4

9 回答 9

520
NSArray *array = [mutableArray copy];

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

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

于 2009-11-20T08:20:16.593 回答
361

AnNSMutableArray是的子类,NSArray因此您并不总是需要转换,但如果您想确保数组不能被修改,您可以NSArray根据您是否希望它自动释放来创建以下任何一种方式:

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

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

编辑: Georg Schölly 提供 的解决方案是一种更好的方法,而且更清洁,特别是现在我们有了 ARC,甚至不必调用 autorelease。

于 2009-11-20T08:08:02.083 回答
113

我喜欢这两个主要解决方案:

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
于 2013-06-20T14:58:33.080 回答
18

你试试这个代码---

NSMutableArray *myMutableArray = [myArray mutableCopy];

NSArray *myArray = [myMutableArray copy];
于 2012-09-13T08:15:17.103 回答
6

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
于 2017-05-06T10:02:23.667 回答
3

在目标 c 中:

NSArray *myArray = [myMutableArray copy];

迅速:

 var arr = myMutableArray as NSArray
于 2017-02-21T13:59:15.627 回答
1
NSArray *array = mutableArray;

这个[mutableArray copy]反模式是整个示例代码。对于临时的并在当前范围结束时被释放的一次性可变数组,请停止这样做。

运行时无法优化对即将超出范围、减为 0 并永久释放的可变数组的浪费复制。

于 2017-10-05T15:17:31.160 回答
0

我在 swift 3 中寻找答案,这个问题在搜索中显示为第一个结果,我从中得到了答案,所以这里是 swift 3 代码

let array: [String] = nsMutableArrayObject.copy() as! [String]
于 2017-02-20T13:29:27.850 回答
0

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

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

    return mutableArray;
}

如果您“信任”调用者将(技术上仍然可变的)返回对象视为不可变的 NSArray,那么这是一个比[mutableArray copy].

苹果同意:

要确定它是否可以更改接收到的对象,消息的接收者必须依赖于返回值的形式类型。例如,如果它接收到类型为不可变的数组对象,则不应尝试对其进行变异。根据其类成员资格确定对象是否可变不是可接受的编程实践。

上述做法在这里更详细地讨论:

最佳实践:如果返回类型为 NSArray,则返回 mutableArray.copy 或 mutableArray

于 2016-03-24T18:35:39.123 回答