2012-04-21 1 views
0

분명히 이걸 가지고 뭔가를 얻지 못했습니다.IOS - NSMutableString : 속성을 추가하고 초기화하는 중

XML 문서를 구문 분석하므로 foundCharacters가 잘리고 조각으로 처리되기 때문에 하나의 요소에 추가 할 NSMutableString이 있습니다. 이 모든 것을 작동시킬 수는 있지만 작동하지 않는 이유가 무엇인지 이해하지 못합니다.

@property (copy, nonatomic) NSMutableString *currentFoundCharacter; 

이렇게하면 ViewController의 속성을 선언합니다.

그럼 내가 가진 :
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
    { 
    if (!currentFoundCharacter) { 
     currentFoundCharacter = [[NSMutableString alloc] init]; // Have to do this or new strings never append to it. 
    } 
    if ([currentAttribute compare:@"description"] == NSOrderedSame && currentAttribute.length > 1) { 
    [currentFoundCharacter appendString:[string copy]]; 
    } 

지금 여기이 잘 작동합니다. 그것은 내가 원하는 모든 요소 내에서 결합 할 것입니다. 하지만 합성 메서드를 사용하려고하면 기본적으로 모든 currentFoundCharacters를 self.currentFoundCharacters로 바꾸기 때문에 불변의 개체를 변경하려고하면 오류가 발생합니다.

어쩌면 내가 왜, 그리고 왜 인스턴스 변수를 사용하지만, init 메소드 밖에서 그런 식으로 오해했는지 모르겠다. 나는 인상을 받고 있었지만 setter/getters를 사용하는 것이 더 좋았다. 결국 나는 유지 보수 가능한 코드를 만들고 싶습니다.

+0

변경할 수있는 클래스를 copy로 선언하지 않겠습니다. – CodaFi

+0

나는 며칠 전 xml을 파싱하는 법을 배웠다. 내가 볼 수있는 두 가지 차이점 만 있습니다. 1. 'currentFoundCharacter'를 내 클래스의 속성으로 만들지 않았습니다. 인터페이스에서 선언 한 것뿐입니다. 2. NSMutableString을 한 번만 할당하고'[NSMutableString string]'을 사용하여 비 웁니다. –

답변

3

재산에 copy 대신 retain을 사용하십시오. 복사하면 변경 불가능한 사본이 제공됩니다.

+0

위의 CodaFi의 의견은 옳았습니다. 나는 그 안에 많은 생각을 두지 않았지만, NSMutableString이 다르다는 것을 깨닫지 못하고 전달되는 문자열을 소유 할 수 있도록 항상 NSString의 복사본을 만들었습니다. 그게 내 문제를 해결했지만이 답은 기술적으로도 옳았습니다. – Doug