2010-12-06 5 views
0

NSUserDefaults에서 저장된 사용자 지정 개체를로드하려고 할 때 누수가 발생했습니다. 범인의 코드는 다음과 같습니다. 분명히 잘못된 것을 본 사람이 있습니까? 사용자 개체의 decodeObjectForKey에 대한 메모리 누수

@interface CustomQuery : NSObject <NSCoding> { 
NSString *theTitle; 
NSString *query; 
} 

@property(nonatomic, retain) NSString *theTitle; 
@property(nonatomic, retain) NSString *query; 

- (id)initWithCoder:(NSCoder *)aDecoder { 

if (self = [super init]) { 
    //tempTitle is leaking 
    NSString *tempTitle = [[aDecoder decodeObjectForKey:@"QueryTitle"] retain]; 
    self.theTitle = tempTitle; 
    [tempTitle release]; 

    //tempQuery is leaking 
    NSString *tempQuery = [[aDecoder decodeObjectForKey:@"QueryValue"] retain]; 
    self.query = tempQuery; 
    [tempQuery release]; 
} 
return self; 
} 

- (void)dealloc { 
[theTitle release]; 
[query release]; 
[super dealloc]; 
} 

또한이에서 악기

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedQueries"]; 
if (dataRepresentingSavedArray != nil) 
{ 

    //This is Leaking in Instruments 
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray]; 
    if (oldSavedArray != nil) { 

     //tempCustomQueryArray is also leaking 
     NSMutableArray *tempCustomQueryArray = [[NSMutableArray alloc] initWithArray:oldSavedArray]; 
     if (savedQueries != nil) { 
      savedQueries = nil; 
     } 
     self.savedQueries = tempCustomQueryArray; 
     [tempCustomQueryArray release]; 
    } 
} 

답변

2

의 누출로 나열됩니다 : 당신의 속성은 객체를 retain 때문에

NSString *tempTitle = [[aDecoder decodeObjectForKey:@"QueryTitle"] retain]; 
self.theTitle = tempTitle; 
[tempTitle release]; 

retainrelease은 필요하지 않습니다. 그러나, 나는이 두 줄이 빨간 청어라고 생각합니다. 누설은 다른 곳에서있을 가능성이 큽니다.

dealloc에 나와 있지 않은 것으로 생각되는데 savedQueries이 출시되지 않은 것으로 판단됩니다. 그것은 쿼리와 다른 것들을 묶어 버릴 것입니다.

oldSavedArray의 누수가 어디에서 왔는지는 완전히 설명하지 않습니다 (누락 된 것이 아니라면).

할당 기기에서 보관/이탈 추적을 켜고 모든 유지/릴리스가 호출되는 위치를 확인합니다. 당신은 어딘가에서 불균형 한 것을 발견 할 것입니다.

나는 관련이 있으며 도움이 될 수있는 blog post를 작성했습니다.

+0

덕분에 나는 그 기능을 켜고 좀 더 의미있는 정보를 찾을 수 있는지 보자 : 나는 또한 당신의 CustomQuery.m 방법을 반영하기 위해 변경하려고 할 것입니다. – aahrens

+0

더 자세히 살펴본 후 나는 명백한 오류를 놓쳤다. oldSavedArray를 초기화하는 위의 코드는 내 viewDidLoad 메서드와 viewWillAppear 메서드에서 모두 사용되었습니다. 도움을 주셔서 감사합니다 – aahrens

0

encodeWithCoder 대리자 메서드를 구현 한 곳이나 보관 방법 (NSUserDefaults에 저장)이 표시되지 않습니다. 도움말에 대한

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:self.theTitle forKey:@"QueryTitle"]; 
    [encoder encodeObject:self.query forKey:@"QueryValue"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 

    self = [super init]; 
    self.theTitle = [aDecoder decodeObjectForKey:@"QueryTitle"]; 
    self.query = [aDecoder decodeObjectForKey:@"QueryValue"]; 

    return self; 
} 
+0

[[NSUserDefaults standardUserDefaults] setObject : [NSKeyedArchiver archivedDataWithRootObject : savedQueries] forKey : @ "savedQueries"];를 호출합니다. 내 사용자 지정 개체를 저장하려면 – aahrens