2010-12-07 2 views
14

나는 다음 코드를 가지고 NSArray 대신 NSMutable 배열을 사용하려고합니다. 현재 메서드가 작동하지 않으므로 NSMutable 배열을로드하는 방법을 말해 줄 수 있습니까?NSMutableArray from NSArray

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

을하지만 값을로드 않습니다

-(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]; 

내가 시도? [xpathparser ...]NSArray을 반환 가정

답변

33

NSArray 개체에서 mutableCopy을 호출하여 NSMutableArray을 다시 보낼 수 있습니다.

메서드 이름에 "copy"가 있으므로 호출 수신자가이 개체의 소유권을 얻습니다.

(Apple's memory management guide는 메소드의 이름이 "새로운"또는 "복사"규칙에 의해 소유 객체를 반환해야하고, 같은 어떤 시점에서 소유권을 포기해야한다, 단어 "ALLOC"를 포함하는 것을 말한다.)

+1

나는 당신을 투표 할 것이지만 "관례에 따라 참조 횟수가 1 인 객체를 반환해야한다"고 썼다. 이것은 기술적으로 잘못된 것이다. 실제로 자신의 링크를 읽는다면 객체 소유권 정책 섹션에서 "보유 횟수"라는 문구를 사용하지 않는다는 것을 알 수 있습니다. – JeremyP

+0

@JeremyP 음, 좋은 지적입니다. 결정된. –

+1

당신은 그 요점을 놓쳤습니다. Apple의 메모리 관리 가이드에 따르면 컨벤션은 당신이 그 대상을 소유하고 있다는 것입니다. 보유 개수가 1 인 구현 세부 사항입니다 (어쨌든 항상 사실 인 것은 아닙니다). – JeremyP

5

, 당신은 사용할 수 있습니다 : 간단하게이 같은

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

'+ [NSMutableArray arrayWithArray :]'는 자동 반복 처리의 이점을 가지고 있습니다. - [NSArray mutableCopy]를 사용한다면,/autorelease를 스스로 해제해야합니다. –

+0

ARC에서 Nick Forge의 코멘트가 무관합니까? –

+0

@BasilBourque 아니요, 아직 오래되었지만 여전히 유지 관리되는 일부 앱은 여전히 ​​MRR을 사용합니다 – James

31

을 :

말 그대로의
NSArray* someArray = [xpathParser search:@"//h3"]; 
NSMutableArray* mutableArray = [someArray mutableCopy]; 

, 그것.