如何在objective-c中将NSMutableArray转换为NSArray?
答案 0 :(得分:495)
NSArray *array = [mutableArray copy];
Copy
制作不可变副本。这非常有用,因为Apple可以进行各种优化。例如,将copy
发送到不可变数组只保留对象并返回self
。
如果您不使用垃圾收集或ARC,请记住-copy
保留该对象。
答案 1 :(得分:358)
NSMutableArray
是NSArray
的子类,因此您并不总是需要转换,但如果您想确保无法修改数组,则可以创建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)
下面是将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]
更便宜的选项。
要确定它是否可以更改接收的对象,消息的接收者必须依赖于返回值的正式类型。例如,如果它收到一个类型为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]