2010-12-07 4 views
14

J'ai le code suivant et je veux utiliser des tableaux NSMutable au lieu de NSArray pourriez-vous me dire comment charger le tableau NSMutable, comme la méthode actuelle ne fonctionne pas.NSMutableArray de 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]; 

j'ai essayé:

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

mais il charge les valeurs?

Répondre

33

Vous pouvez appeler mutableCopy sur un objet NSArray pour qu'il vous renvoie un NSMutableArray.

Notez que l'appelé obtiendra la propriété de cet objet puisque le nom de la méthode contient "copy".

(Apple's memory management guide indique qu'un nom de méthode contenant les mots « alloc », « nouveau » ou « copie » doit, par convention, retourner un objet que vous possédez, et en tant que telle doit renoncer à la propriété d'à un moment donné.)

+1

Je voudrais vous up voté mais vous avez écrit "devrait par convention retourner un objet avec un nombre de référence = 1" ce qui est techniquement faux. En fait, si vous lisez votre propre lien, vous verrez qu'il n'utilise même pas l'expression "retain count" dans la section de la politique de propriété de l'objet. – JeremyP

+0

@JeremyP Hmm, bon point. Fixé. –

+1

Vous avez manqué le point. Le guide de gestion de la mémoire d'Apple dit que la convention est que vous * possédez * l'objet. C'est un détail d'implémentation que le nombre de retenue est 1 (ce qui n'est pas toujours vrai de toute façon). – JeremyP

5

En supposant [xpathparser ...] retourne un NSArray, vous pouvez utiliser:

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

'+ [NSMutableArray arrayWithArray:]' a l'avantage d'être autoeleased - si vous utilisez '- [NSArray mutableCopy]', vous devrez libérer/autorelease vous-même. –

+0

Le commentaire de Nick Forge n'est-il plus pertinent dans ARC? –

+0

@BasilBourque non, certaines applications plus anciennes mais toujours maintenues utilisent encore MRR – James

31

simplement comme ceci:

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

C'est tout à fait littéralement, il.