我如何转换NSMutableArray到NSArray在objective-c?
当前回答
如果你正在通过可变性构造一个数组,然后想要返回一个不可变的版本,你可以通过继承简单地将可变数组作为“NSArray”返回。
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
如果你“信任”调用者将返回对象(技术上仍然是可变的)视为一个不可变的NSArray,这是一个比[mutableArray copy]更便宜的选择。
苹果表示赞同:
为了确定是否可以更改接收到的对象,消息的接收方必须依赖于返回值的形式类型。例如,如果它接收到一个类型为不可变的数组对象,它不应该试图改变它。根据对象的类成员关系来确定对象是否可变,这是不可接受的编程实践。
以上实践在这里进行了更详细的讨论:
最佳实践:返回mutableArray。copy或mutableArray如果返回类型是NSArray
其他回答
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保留对象。
如果你正在通过可变性构造一个数组,然后想要返回一个不可变的版本,你可以通过继承简单地将可变数组作为“NSArray”返回。
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
如果你“信任”调用者将返回对象(技术上仍然是可变的)视为一个不可变的NSArray,这是一个比[mutableArray copy]更便宜的选择。
苹果表示赞同:
为了确定是否可以更改接收到的对象,消息的接收方必须依赖于返回值的形式类型。例如,如果它接收到一个类型为不可变的数组对象,它不应该试图改变它。根据对象的类成员关系来确定对象是否可变,这是不可接受的编程实践。
以上实践在这里进行了更详细的讨论:
最佳实践:返回mutableArray。copy或mutableArray如果返回类型是NSArray
我喜欢这两个主要的解决方案:
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
推荐文章
- 如何更改导航栏上“后退”按钮的标题
- 有没有办法从UITableView中移除分隔线?
- 如何在Objective-C中声明类级属性?
- 在Objective-C中@property保留,赋值,复制,非原子
- 我如何在NSAttributedString中创建一个可点击的链接?
- 停止UIWebView垂直“弹跳”?
- 对未渲染的视图进行快照,结果是一个空快照
- 开始使用instancetype而不是id是否有益?
- 改变UISegmentedControl的字体大小
- 我可以强制UITableView隐藏分隔符之间的空单元格吗?
- 为什么Objective-C文件使用。m扩展名?
- Objective-C for Windows
- 获得推送通知,而应用程序在前台iOS
- 如何取消选定的UITableView单元格?
- 设置自定义UITableViewCells的高度