이 코드를iPhone 앱에서 메모리를 안정적으로 해제하려면 어떻게해야합니까?
NSString *postData = [@"foo=" stringByAppendingString:fooText.text];
...
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
...
[postData release]; //this causes crash
[request release]; //this causes crash
이있는 경우 지금은 이것이 expected behavior according to Apple's documents 이해. 이제 릴리스 코드를 제거하면 크래시가 발생하지 않지만 어쨌든 * 요청에 대해 메모리 누수가 발생합니다. 그래서 나는 코드를 다시 작성한다.
NSString *postData;
//postData = [NSString alloc]; // this line commented out since OP
postData = [@"foo=" stringByAppendingString:fooText.text];
...
NSMutableURLRequest *request;
request = [NSMutableURLRequest alloc];
request = [request initWithURL:url];
...
[postData release]; //this still crashes #
[request release]; //this works fine
#가 추락하는 이유를 정말로 모른다. 여기에 권장되는 모범 사례가 있습니까? 나는 종종 '속기'접근법 (맨 위에)이 공개되어 (Kochan, Objective-C 프로그래밍) 예를 들어보기 때문에 무언가를 놓치고 있다고 생각하지만, Apple docs는 그것이 잘못되었다고 말한다.
"일반적으로 헬퍼 정적 메서드 (예 : stringByAppendingString)를 호출하는 경우이를 해제하면 안됩니다." 그게 내가 찾고 있던거야!그러나 악기가 메모리 누수가 있음을 나타내는 경우 (첫 번째 예제에서는 * 모두가 간단한 메소드 안에 있음) 주어진 * 요청을 어떻게 풀려고합니까? 이것은 autorelease가 * 요청을 위해 작동하지 않았다는 것을 나타내는 것 같습니다. – Gazzer
첫 번째 예에서는 사용자가 직접 요청을 할당하고 입력 했으므로 릴리스해야합니다. 당신이 할 때 당신이 겪는 충돌은 무엇입니까? EXC_BAD_ACCESS? 이는 대개 이미 요청한 것을 (또는 요청한) 요청을 의미하고 사용자는이를 인식하지 못했습니다. –