2011-07-19 102 views
3

我在看一个老WWDC的视频,并在其splitViewController例如,他们这样做的委托方法为splitViewController:当使用mutableCopy为NSMutableArray的

NSMutableArray *toolBarItems = [[toolbar items] mutableCopy]; 
[toolbarItems removeObjectAtIndex:0]; 
[toolbar setItems: toolbarItems animated YES]; 
[toolbarItems release]; 

是否有制作一般的好习惯mutableCopy像这样用于某些方法中的数据?我以前没有见过这样的人,并且作为一名新程序员,不知道何时或为什么我会/应该使用某个东西的副本而不是原来的东西。我想我可以在列表中看到它,它已经以某种方式订购了,也许我会复制它以不同的方式对它进行重新排序。但我不知道这是否是他们的推理,以及是否有其他最佳做法来做到这一点。谢谢!

回答

2

在您提供的示例中,[toolbar items]提供的数组是不可变的。如果你想改变它,你必须制作一个可变版本,修改而不是,然后通过setItems:animated:方法将修改后的副本传递回工具栏。在这种情况下的修改是删除数组中的第一个工具栏项,但重申一下,您不能修改不可变数组。

+0

如果我们想要修改不可变的副本,那么我们也可以创建[NSMutableArray arrayWithArray:]。那么它与mutableCopy有什么不同呢? – MuraliMohan

+0

@MuraliMohan -mutableCopy提供了一个不是自动发布的副本。 + [NSMutableArray arrayWithArray:]提供放置在autorelease池中的副本;即自动释放。 – trudyscousin

+0

好吧然后我会用[[NSMutableArray alloc] initWithArray:]我认为它不是autoreleased。我强烈的问题是=>而不是复制我们可以创建新的对象与现有的数据,并使用它作为复制的对象? – MuraliMohan

4

可变意味着可改变。所以,如果你需要改变数组,你需要获得它的一个可变版本。 NSArray意味着NS(Immutable)Array这意味着您无法更改其数据。

+0

如果我们想修改不可变的副本,那么我们也可以创建[NSMutableArray arrayWithArray:]。那么它与mutableCopy有什么不同呢? – MuraliMohan