如何在Objective-c中将 NSMutableArray 转换为 NSArray ?
9 回答
NSArray *array = [mutableArray copy];
Copy
制作不可变的副本。这非常有用,因为 Apple 可以进行各种优化。例如,发送copy
到不可变数组只保留对象并返回self
。
如果您不使用垃圾收集或 ARC,请记住-copy
保留对象。
AnNSMutableArray
是的子类,NSArray
因此您并不总是需要转换,但如果您想确保数组不能被修改,您可以NSArray
根据您是否希望它自动释放来创建以下任何一种方式:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
编辑: Georg Schölly 提供 的解决方案是一种更好的方法,而且更清洁,特别是现在我们有了 ARC,甚至不必调用 autorelease。
我喜欢这两个主要解决方案:
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
你试试这个代码---
NSMutableArray *myMutableArray = [myArray mutableCopy];
和
NSArray *myArray = [myMutableArray copy];
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
在目标 c 中:
NSArray *myArray = [myMutableArray copy];
迅速:
var arr = myMutableArray as NSArray
NSArray *array = mutableArray;
这个[mutableArray copy]
反模式是整个示例代码。对于临时的并在当前范围结束时被释放的一次性可变数组,请停止这样做。
运行时无法优化对即将超出范围、减为 0 并永久释放的可变数组的浪费复制。
我在 swift 3 中寻找答案,这个问题在搜索中显示为第一个结果,我从中得到了答案,所以这里是 swift 3 代码
let array: [String] = nsMutableArrayObject.copy() as! [String]
如果您通过可变性构造一个数组,然后想要返回一个不可变的版本,您可以简单地通过继承将可变数组作为“NSArray”返回。
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
如果您“信任”调用者将(技术上仍然可变的)返回对象视为不可变的 NSArray,那么这是一个比[mutableArray copy]
.
要确定它是否可以更改接收到的对象,消息的接收者必须依赖于返回值的形式类型。例如,如果它接收到类型为不可变的数组对象,则不应尝试对其进行变异。根据其类成员资格确定对象是否可变不是可接受的编程实践。
上述做法在这里更详细地讨论: