如何将NSMutableArray转换为NSArray?

时间:2009-11-20 07:42:58

标签: objective-c cocoa-touch cocoa nsmutablearray nsarray

如何在中将NSMutableArray转换为NSArray?

9 个答案:

答案 0 :(得分:495)

NSArray *array = [mutableArray copy];

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

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

答案 1 :(得分:358)

NSMutableArrayNSArray的子类,因此您并不总是需要转换,但如果您想确保无法修改数组,则可以创建NSArray这些方式中的任何一种取决于您是否要自动释放它:

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

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

编辑: The solution由GeorgSchölly提供的是一种更好的方式,更清洁,特别是现在我们有ARC,甚至不需要调用autorelease。 / p>

答案 2 :(得分:112)

我喜欢两种主要解决方案:

NSArray *array = [NSArray arrayWithArray:mutableArray];

或者

NSArray *array = [mutableArray copy];

主要区别我在其中看到是mutableArray为零时的行为

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

NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil

答案 3 :(得分:18)

你试试这个代码---

NSMutableArray *myMutableArray = [myArray mutableCopy];

NSArray *myArray = [myMutableArray copy];

答案 4 :(得分:4)

目标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中有新数据类型数组。使用 let 关键字声明数组,然后它将变为 NSArray 如果使用 var 关键字声明,则它变为的NSMutableArray

示例代码:

let newArray = oldArray as Array

答案 5 :(得分:3)

在objective-c:

NSArray *myArray = [myMutableArray copy];

在swift中:

 var arr = myMutableArray as NSArray

答案 6 :(得分:2)

NSArray *array = mutableArray;

这个[mutableArray copy]反模式遍布示例代码。对于瞬态的可丢弃的可变数组停止这样做,并在当前作用域的末尾取消分配。

运行时无法优化对即将超出范围的可变数组的浪费复制,将其减少为0并取消分配。

答案 7 :(得分:1)

如果您通过可变性构建数组然后想要返回不可变版本,则可以简单地将可变数组作为" NSArray"通过继承。

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

    return mutableArray;
}

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

Apple concurs:

  

要确定它是否可以更改接收的对象,消息的接收者必须依赖于返回值的正式类型。例如,如果它收到一个类型为immutable的数组对象,就不应该尝试改变它。根据类成员资格确定对象是否可变是不可接受的编程习惯。

此处将更详细地讨论上述做法:

Best Practice: Return mutableArray.copy or mutableArray if return type is NSArray

答案 8 :(得分:0)

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

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