Geo*_*lly 499

NSArray *array = [mutableArray copy];
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Yar:你看一下[NSCopying*的文档](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/Reference/Reference.html#// apple_ref/occ/intfm/NSCopying/copyWithZone :)它在那里声明:**copyWithZone***如果考虑"immutable vs. mutable"适用于接收对象,则返回的副本是不可变的; 否则,副本的确切性质由班级决定.* (22认同)
  • 这个答案很棒,但我怎么能从文档中看出`copy`创建了一个普通的NSArray而不是NSMutableArray? (2认同)
  • @Brad:这只是指具有可变和不可变实现的类.例如`NSArray`&`NSMutableArray`,`NSString`&`NSMutableString`.但不是例如`NSViewController`总是包含可变状态. (2认同)

hal*_*ski 359

An NSMutableArray是一个子类,NSArray所以你不需要总是需要转换,但如果你想确保不能修改数组,你可以创建NSArray这些方法中的任何一种,具体取决于你是否要自动释放它:

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

/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
Run Code Online (Sandbox Code Playgroud)

编辑: GeorgSchölly提供的解决方案是一种更好的方式,更清洁,特别是现在我们有ARC,甚至不需要调用autorelease.

  • 我可以做(NSArray*)myMutableArray吗? (7认同)
  • 但是,转换为(NSArray*)仍然允许强制转换为(NSMutable*).不是这样的吗? (4认同)
  • 是的,因为NSMutableArray是NSArray的子​​类,它是有效的. (2认同)

Ric*_*ble 113

我喜欢这两个主要解决方案:

NSArray *array = [NSArray arrayWithArray:mutableArray];
Run Code Online (Sandbox Code Playgroud)

要么

NSArray *array = [mutableArray copy];
Run Code Online (Sandbox Code Playgroud)

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

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

NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
Run Code Online (Sandbox Code Playgroud)

  • @durazno 这没有错。仔细检查你的测试。如果 [mutableArray copy] 返回一个空数组,那么 mutableArray 一定是一个空数组。我的答案仅适用于 mutableArray 为零的情况。 (3认同)

小智 18

你试试这个代码---

NSMutableArray *myMutableArray = [myArray mutableCopy];
Run Code Online (Sandbox Code Playgroud)

NSArray *myArray = [myMutableArray copy];
Run Code Online (Sandbox Code Playgroud)


Sak*_*iya 6

目标-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;
Run Code Online (Sandbox Code Playgroud)

迅速

在 Swift 3.0 中有新的数据类型Array。使用let关键字声明数组然后它会变成NSArray如果声明使用var关键字然后它变成NSMutableArray

示例代码:

let newArray = oldArray as Array
Run Code Online (Sandbox Code Playgroud)