2010-12-07 18 views
14

私は以下のコードを持っています。NSArrayの代わりにNSMutable配列を使いたいです。 NSMutable配列をロードする方法を教えてください。現行のメソッドは機能しません。NSMutableArray from NSArray

-(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"]; 
をそれが値をロードしていますか? [xpathparser ...]NSArrayを返すと仮定

答えて

33

NSArrayオブジェクトでmutableCopyを呼び出して、NSMutableArrayを返すことができます。

メソッド名に "copy"が含まれているため、呼び出し先がこのオブジェクトの所有権を取得することに注意してください。

Apple's memory management guideは、慣例により、あなたが所有するオブジェクトを返す必要があり、そのようにいくつかの点での所有権を放棄しなければならない「新しい」または「コピー」、言葉「ALLOC」を含むそのメソッドの名前を述べています。)

+1

私はあなたに投票しましたが、 "慣習的には参照カウント= 1のオブジェクトを返すべきです"と書いてありますが、これは技術的に間違っています。実際にあなた自身のリンクを読むと、オブジェクト所有権ポリシーのセクションで "retain count"というフレーズを使用していないことがわかります。 – JeremyP

+0

@ジェレミーPええ、良い点。一定。 –

+1

あなたはその点を見逃しています。アップルのメモリ管理ガイドによると、このコンベンションでは、オブジェクトを所有していると言われています。保持カウントが1である実装の詳細です(これは常にとは限りません)。 – JeremyP

5

、あなたが使用することができます。単純にこのような

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

'+ [NSMutableArray arrayWithArray:]'は自動リリースされるという利点があります。 - [NSArray mutableCopy]を使用する場合は、/ autoreleaseを自分でリリースする必要があります。 –

+0

Nick Forgeによるコメントは、ARCの下では無関係ですか? –

+0

@BasilBourqueいいえ、古いもののまだメンテナンスされている一部のアプリではまだMRRを使用しています – James

31

を:

文字通りだ
NSArray* someArray = [xpathParser search:@"//h3"]; 
NSMutableArray* mutableArray = [someArray mutableCopy]; 

、それ。

関連する問題