我如何转换NSMutableArray到NSArray在objective-c?
当前回答
您可以试试这段代码
NSMutableArray *myMutableArray = [myArray mutableCopy];
and
NSArray *myArray = [myMutableArray copy];
其他回答
NSArray *array = mutableArray;
这个[mutableArray copy]反模式在示例代码中随处可见。停止这样做的一次性可变数组是瞬态的,并在当前作用域的末尾被释放。
运行时无法优化对即将超出作用域的可变数组的浪费复制,将其降为0并永久释放。
NSMutableArray是NSArray的一个子类,所以你并不总是需要转换,但如果你想确保数组不能被修改,你可以根据你是否希望它自动释放来创建一个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。
如果你不使用垃圾收集或ARC记住-copy保留对象。
我在swift 3中搜索答案,这个问题被显示为搜索的第一个结果,我从中得到了答案的灵感 这是swift 3的代码
let array: [String] = nsMutableArrayObject.copy() as! [String]
我喜欢这两个主要的解决方案:
NSArray *array = [NSArray arrayWithArray:mutableArray];
Or
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
推荐文章
- 如何停止不必要的UIButton动画标题变化?
- 以编程方式获取Bundle Identifier
- 如何在我的iPhone应用程序中使用NSError ?
- Objective-C中的自动引用计数不能防止或减少什么样的泄漏?
- 如何精确地以毫秒为单位记录方法的执行时间?
- 在整个UIWindow中获取UIView的位置
- 保存字符串到NSUserDefaults?
- 查看保存的NSUserDefaults的简单方法?
- 如何添加UITableViewCell之间的间距
- 在为设备编译时,Apple Mach-O连接器错误
- 如何从iPhone应用程序发送邮件
- 理解设置
- 架构i386的未定义符号:_OBJC_CLASS_$_SKPSMTPMessage",引用自:错误
- UILabel对齐文本到中心
- Objective-C中方法混合的危险是什么?