提问



如何在objective-c中将NSMutableArray转换为NSArray?/questions/tagged/objective-c

最佳参考


NSArray *array = [mutableArray copy];


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


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

其它参考1


NSMutableArrayNSArray的子类,所以你不会总是需要转换,但是如果你想确保不能修改数组,你可以创建一个NSArray这些方式取决于您是否要自动释放它:


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

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


编辑:GeorgSchölly提供的解决方案是一种更好的方式,更清除,特别是现在我们有ARC而且甚至不需要调用自动释放。

其它参考2


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


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


你试试这个代码---


NSMutableArray *myMutableArray = [myArray mutableCopy];





NSArray *myArray = [myMutableArray copy];

其它参考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


在objective-c:


NSArray *myArray = [myMutableArray copy];


快速:


 var arr = myMutableArray as NSArray

其它参考6


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


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

    return mutableArray;
}


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


Apple同意:[29]



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



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


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

其它参考7


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


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

其它参考8


NSArray *array = mutableArray;


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


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