2010-03-29 5 views
0

다음 코드는 몇 가지 문제를 일으키는 것입니다. 세 번째 줄은 프로그램 충돌을 일으 킵니다 ... 프로그램을 처음 밟을 때 발생하지는 않지만 나중에 프로그램에서 발생합니다. 세 번째 줄을 주석으로 처리하면 프로그램이 원활하게 실행됩니다. '내가 할 수있는 ... 사람이 어떻게 다른 일반 언어처럼 목표 - C에서 문자열을 연결하는 말해 줄 수, 보조 노트에Objective-c 문자열 추가 원인 예외

*** -[CFString release]: message sent to deallocated instance 0xb4c43fe0

:

NSString *myRequestString = @"text"; 
int i = 1; 
myRequestString = [myRequestString stringByAppendingString:[NSString stringWithFormat: @"t=%d", i]]; 

그 코드는이 예외가 발생합니다 연결 연산자가 없다고 생각하지 마십시오.

모든 도움을 주시면 대단히 감사하겠습니다.

+0

알다시피,'-stringByAppendingFormat :'을 사용할 수 있습니다. – kennytm

+0

그 팁 주셔서 감사합니다,하지만 그것을 전환했지만 여전히 예외가 발생합니다. –

+0

해당 줄에서 예외가 발생했는지 또는 코드의 다른 곳에서 예외가 발생 했습니까? 'someString'이 이미 할당 해제 된 후에 (또는 카운트가 0 인) 당신 (또는 뭔가)이'[someString release]'를 호출하고 있음을 나타냅니다. 또한 'stringByAppendingString'은 NSString의 * new * 인스턴스를 반환하므로 원래 인스턴스 인'myRequestString'을 유출하고 있습니다. 당신은'myRequestString = [[myRequestString autorelease] stringByAppending ......] '으로 해결할 수 있습니다. –

답변

0

myRequestString을 유지하지 않고 언젠가 풀어내는 것처럼 들리 겠지만, 정확하지 않습니다. according to the memory management rules.

아니요, 연결 연산자가 없습니다. C에 하나도 없습니다.

-1

당신은 그렇게 할 수있는 NSMutableString이 필요합니다

NSMutableString *myRequestString = [[NSMutableString alloc] initWithCapacity:20]; 
[myRequestString appendString:@"text"]; 
int i = 1; 
myRequestString = [myRequestString appendFormat: @"t=%d", i]; 

잊지 마세요 : NSString is immutable.

+2

"그 일을하기 위해 NSMutableString이 필요하다"는 것은 무엇을 의미합니까? NSString은 그가하는 일과 똑같은 방식으로 작동합니다. 즉, 추가 작업을 수행하지는 않지만 잘 작동합니다. 그는 어떤 시점에서 자신의 기억을 올바르게 관리하지 못하고 있습니다. autoreleased NSMutableString을 사용하면, 같은 방식으로 폭발합니다. – Chuck