2010-03-01 2 views
0

NSURLResponse의 보관 및 보관 해제로 인해 누수가 발생하는 누수가 발견되어 이유를 파악할 수 없습니다.NSURLResponse가 아카이브 될 때 메모리가 누출되는 이유는 무엇입니까?

- (void)doStuffWithResponse:(NSURLResponse *)response { 
     NSMutableData *saveData = [[NSMutableData alloc] init]; 
     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:saveData]; 
     [archiver encodeObject:response forKey:@"response"]; 
     // Encode other objects 
     [archiver finishDecoding]; 
     [archiver release]; 
     // Write data to disk 
     // release, clean up objects 
    } 

    - (void)retrieveResponseFromPath:(NSString *)path { 
     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:path]]; 
     NSURLResponse *response = [unarchiver decodeObjectForKey:@"response"]; 
     // The above line leaks!! 
     // decode other objects 
     // clean up memory and do other operations 
    } 

NSURLResponse를 보관 취소 할 때 악기가 누출을보고합니다. 내가 그걸 언급하고 그것을 사용하지 않는다면 누출은 없다. 흥미로운 점은 대신 NSURL 응답의 일부를 저장 했으므로 누출이 없음을 의미합니다.

// Encode: 

[archiver encodeObject:[response URL] forKey:@"URL"]; 
[archiver encodeObject:[response MIMEType] forKey:@"MIMEType"]; 
[archiver encodeObject:[NSNumber numberWithLongLong:[response expectedContentLength]] forKey:@"expectedContentLength"]; 
[archiver encodeObject:[response textEncodingName] forKey:@"textEncodingName"]; 

    // Decode: 

NSURL *url = [unarchiver decodeObjectForKey:@"URL"]; 
NSString *mimeType = [unarchiver decodeObjectForIKey:@"MIMEType"]; 
NSNumber *expectedContentLength = [unarchiver decodeObjectForKey:@"expectedContentLength"]; 
NSString *textEncodingName = [unarchiver decodeObjectForKey:@"textEncodingName"]; 

NSURLResponse* response = [[NSHTTPURLResponse alloc] initWithURL:url MIMEType:mimeType expectedContentLength:[expectedContentLength longLongValue] textEncodingName:textEncodingName]; 

누구인지 알 수 있습니다. NSURLResponse를 보관하는 버그가 있습니까? 아니면 제가 잘못하고 있습니까?

답변

1

Objective-C의 메모리 관리는 메소드 이름에 "alloc", "new"또는 "copy"가있는 항목을 호출 할 때마다 (또는 유지하는 경우) 어느 시점에 풀어 놓는다. 자세한 내용은 다음을 참조하십시오 : http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

경우에 따라 NSMutableData를 만들려면 alloc을 호출하지만 doStuffWithResponse의 끝에는 [saveData release]를 놓아서는 안됩니다. 하나 이상의 누설을 해결할 수 있습니다. 이 코드에서 이것은 또한 alloc'ed NSKeyedUnarchiver와 alloc'ed NSURLResponse의 경우 인 것처럼 보입니다.

ivar처럼 값을 붙잡고 있지 않다면 alloc'ing 직후에 autorelease를 호출하거나 사용 가능한 경우 클래스의 자동 생성 된 작성자를 사용할 수도 있습니다 (예 : [[NSString stringWithFormat :] 대신 [[ NSString alloc] initWithFormat :]).

빌드> 빌드 및 분석을 선택하면 이러한 문제가 나타날 수도 있습니다.

+0

코드는 실제로 // 릴리스 아래 개체 섹션을 정리합니다. 누출을 일으키는 정확한 위치에 더 많은 초점을 맞추기 위해 제공하지는 않았지만 더 혼동을 일으키고 있다고 생각합니다. 앞서 말했듯이 특정 코드 행을 주석 처리하면 계측기에서 누출이 없음을 알립니다. 정적 분석기는 간단한 누수에 대해 불평하지 않습니다. 나는 내 문제가 여전히있는 모든 대상을 풀어 놓고있다. –

관련 문제