2012-01-02 4 views
1

나는이 코드 문자열을 가지고 있으며 메모리를 확보하는 데 문제가 있습니다. 릴리스하는 사람 만 초기화되고 자동 릴리스되지는 않지만 문자열 "end"및 nSum 릴리스에 문제가 있음을 이해했습니다. .NSString 릴리스

NSString *urlBase = [[NSString alloc] initWithFormat:@"http://service.svc/"]; 
NSString *op = [[NSString alloc] initWithFormat:@"op1"]; 
NSString * final = [urlBase stringByAppendingFormat:op]; 
NSString * nSum = sumTextfield.text; 
final = [final stringByAppendingFormat:nSum]; 

//release 

[ urlBase release ]; 
[ op release ]; 
//[final release]; error 
//[final autorelease]; error 

도움에 감사드립니다.

UPDATE : 당신이 초기화, 새, 복사 또는 mutableCopy로 시작하는 방법을 사용하여 객체를 생성하는 경우

- (IBAction)mostrarOpciones { 
// code (UP) 
} 

답변

3

는, 당신은 그 객체를 소유하고 해제 (또는 그것을 autoreleasing)에 대한 책임이 있습니다 너는 그걸로 끝이야. 다른 메소드를 사용하여 객체를 만드는 경우 해당 객체는 자동으로 릴리즈되므로 사용자는이를 해제 할 필요가 없습니다. 이 경우 객체를 유지하려면 실제로 객체를 유지해야합니다. Apple에는 이러한 규칙을 모두 포함하는 Memory Management Programming Guide이 있습니다.

게시 한 코드가 실제로 맞습니다. urlBaseop은 init (이 경우 initWithFormat:)로 시작하는 방법을 사용하여 작성했기 때문에 릴리스해야합니다. final과 nSum은 이미 자동으로 자동 완성됩니다. final은 init, new, copy 또는 mutableCopy (이 경우 팩토리 메서드 stringByAppendingFormat:)로 시작하지 않는 메서드로 만듭니다. nSum은 text이라는 메서드로 반환되었으며 sumTextField가 sumTextField를 소유하고 있거나 자동 반환 한 것으로 가정하여 반환 할 수 있습니다. 따라서 사용자는이를 반환하지 않아도됩니다.

+0

autorelease를 적용하여 최종적으로 오류가 발생합니다. 나는이 문자열이 IBAction에 있다는 것을 잊어 버렸고 세 번째 호출 버튼에 오류가 발생했습니다. – JohnPortella

+0

네가 신중히 쓴 것을 읽으면 네가 그것을 얻을 때 이미 파이널 라이즈가 완료되었다는 것을 알게 될 것이므로, 너는 그것을 스스로 풀어 놓거나 자동으로 릴리즈 할 필요가 없다. 자동 포기하면 두 번 자동 실행되어 결국 두 번 릴리스되어 충돌이 발생합니다. –

+0

이제 나는 그 종류의 호출을함으로써 파이널이 autorelease와 함께 온다는 것을 이해했다. 도와 주셔서 감사합니다. – JohnPortella

0

할당하지 않은 NSString을 출시 할 수 없습니다. 두 변수는 할당되지 않으므로 놓을 필요가 없습니다.