从NSArray创建NSMutableArray

16

我有以下代码,想使用NSMutable数组代替NSArray,请问如何加载NSMutable数组,因为当前的方法不起作用。

-(void) whatever{
NSData *htmlData = [[NSString stringWithContentsOfURL:[NSURL URLWithString: @"http://www.objectgraph.com/contact.html"]] dataUsingEncoding:NSUTF8StringEncoding];
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
NSArray *titles  = [xpathParser search:@"//h3"]; // get the page title - this is xpath     notation
TFHppleElement *title = [titles objectAtIndex:0];
NSString *myTitles = [title content];

NSArray *articles  = [xpathParser search:@"//h4"]; // get the page article - this is xpath     notation
TFHppleElement *article = [articles objectAtIndex:0];
NSString *myArtical = [article content];

我已经尝试过:

NSMutableArray *titles  = [xpathParser search:@"//h3"];

但它确实加载了值吗?

3个回答

32

就像这样:

NSArray* someArray = [xpathParser search:@"//h3"];
NSMutableArray* mutableArray = [someArray mutableCopy];

就是这样,字面上就是这个意思。


32
你可以在一个NSArray对象上调用mutableCopy方法,以返回一个NSMutableArray对象。
请注意,由于方法名包含“copy”,因此被调用方将获得该对象的所有权。
苹果内存管理指南指出,方法名包含“alloc”、“new”或“copy”的方法应按照惯例返回一个你拥有的对象,因此必须在某个时刻放弃对其的所有权。)

1
我本来想给你点赞的,但你写的“按照惯例应该返回一个引用计数为1的对象”在技术上是错误的。实际上,如果你自己读一下你提供的链接,就会发现它甚至没有在对象所有权策略部分使用“保留计数”这个词组。 - JeremyP
1
你没有理解重点。苹果的内存管理指南说约定是你拥有对象。保留计数为1是实现细节(而且并不总是真实的)。 - JeremyP

6
假设 [xpathparser ...] 返回一个 NSArray,你可以使用以下代码:
NSMutableArray *titles  = [NSMutableArray arrayWithArray:[xpathParser search:@"//h3"]];

3
+[NSMutableArray arrayWithArray:]是自动释放的,使用它有好处 - 如果使用-[NSArray mutableCopy],则需要手动进行释放/自动释放。 - Nick Forge
Nick Forge的评论在ARC下现在已经不相关了吗? - Basil Bourque
@BasilBourque 不是,一些旧的但仍在维护的应用程序仍然使用MRR。 - James
如果您正在使用MRC,我仍然建议使用我的方法,只需确保执行[[someArray mutableCopy] autorelease]以使其自动释放。 - jer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接