我如何转换NSMutableArray到NSArray在objective - c?
NSMutableArray是NSArray的子类,所以你并不总是需要转换,但如果你想确保数组不能被修改,你可以通过以下两种方式创建NSArray,这取决于你是否希望它自动释放:
NSMutableArray
NSArray
/* Not autoreleased */ NSArray *array = [[NSArray alloc] initWithArray:mutableArray]; /* Autoreleased array */ NSArray *array = [NSArray arrayWithArray:mutableArray];
由Georg Schölly提供的编辑: 解决方案是一种更好的方式,而且更干净,特别是现在我们有了ARC,甚至不必调用autorelease。
NSArray *array = [mutableArray copy];
Copy生成不可变副本。这非常有用,因为苹果可以进行各种优化。例如,将copy发送到一个不可变数组只保留对象并返回self。
Copy
copy
self
如果你不使用垃圾收集或ARC,记住-copy保留对象。
-copy
您可以试试这段代码
NSMutableArray *myMutableArray = [myArray mutableCopy];
而且
NSArray *myArray = [myMutableArray copy];
我喜欢这两个主要的解决方案:
NSArray *array = [NSArray arrayWithArray:mutableArray];
或
我在他们身上看到了主要区别:
NSMutableArray *mutableArray = nil; NSArray *array = [NSArray arrayWithArray:mutableArray]; // array == @[] (empty array) NSMutableArray *mutableArray = nil; NSArray *array = [mutableArray copy]; // array == nil
如果你正在通过可变性构造一个数组,然后想要返回一个不可变的版本,你可以通过继承简单地将可变数组作为“NSArray”返回。
- (NSArray *)arrayOfStrings { NSMutableArray *mutableArray = [NSMutableArray array]; mutableArray[0] = @"foo"; mutableArray[1] = @"bar"; return mutableArray; }
如果你“信任”调用者将返回对象(技术上仍然是可变的)视为不可变的NSArray,这是一个比[mutableArray copy]更便宜的选择。
[mutableArray copy]
苹果同意:
为了确定是否可以更改接收到的对象,消息的接收方必须依赖于返回值的形式类型。例如,如果它接收到类型为不可变的数组对象,则它不应该试图变异它。根据对象的类成员关系来确定对象是否可变,这是不可接受的编程实践。
以上实践在这里进行了更详细的讨论:
最佳实践:返回mutableArray。copy或mutableArray如果返回类型是NSArray
我在swift 3中搜索答案,这个问题在搜索中显示为第一个结果,我从中得到了答案的灵感 这里是swift 3代码
let array: [String] = nsMutableArrayObject.copy() as! [String]
在objective-c中:
用swift:
var arr = myMutableArray as NSArray
下面是将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
var
示例代码:
let newArray = oldArray as Array
NSArray *array = mutableArray;
这个[mutableArray copy]反模式遍布在示例代码中。停止这样做的一次性可变数组是瞬态的,并在当前作用域的末尾被释放。
运行时无法优化对即将超出作用域的可变数组的浪费复制,将其降为0并永久释放。