2010-01-18 4 views
2

저는 iPhone 개발에 새로운 것이므로이 메모리 누수가 있습니다.NSMutableArray initWithContentsOfFile 메모리 누수

NSMutableArray를 사용하여 Documents 디렉토리에있는 .plist 파일의 내용을 검색하고 있습니다.

처음 사용하면 모든 것이 잘되지만, 여러 번 호출하면 메모리 누수가 발생합니다. 내가보기가 나는 악기를 사용하고

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [composedArray release]; 
    composedArray = nil; 
    [savedArray release]; 
} 

을 사라지고이 메모리 누수 소스 코드 줄 것을 나에게 보여줍니다 때마다 해제

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains 
         (NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    //make a file name to write the data to using the 
    //documents directory: 
    fullFileName = [NSString stringWithFormat:@"%@/SavedArray", documentsDirectory]; 
    //retrieve your array by using initWithContentsOfFile while passing 
    //the name of the file where you saved the array contents. 
    savedArray = nil; 
    savedArray = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; 
    self.composedArray = [savedArray copy]; 
    [savedArray release]; 
    [self.tableView reloadData]; 
} 

:

내 코드입니다 :

savedArray = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; 

이 누출 문제를 해결하는 방법을 모르겠다. 누구나 해결책을 공유 할 수 있다면 고맙습니다.

미리 감사드립니다.

답변

5

속성 선언은 어떻게합니까? composedArray?

선언 인 경우 :

메모리 누수가 어디
@property(retain) id composedArray; 

. copy은 참조 횟수를 증가시키고 retain도 증가합니다. 당신이 composedArray에 할당 언제 경우에 당신은 당신이 귀하의 재산을 선언해야합니다 (당신의 코드를 읽어 보인다) 사본을 할당 할 수 있습니다 :

@property(copy) id composedArray; 

하고 수행하는 코드를 변경 :

self.composedArray = savedArray; 

(복사본은 합성 된 접근 자에서 발생합니다).

+0

내 코드가 바뀌어도 아무 것도 바뀌지 않는 것 같습니다. 실제 문제는 뷰가 나타날 때마다 NSMutableArray를 재사용한다는 것이고 이것이 전혀 공개되지 않는다고 생각합니다. – Jonathan

+0

이 코드 줄을 내 viewdidLoad로 이동하면 모든 것이 완벽하게 작동합니다. 즉, NSMutableArray를 재사용하지 않기 때문에 재사용해야합니다. 어떻게해야합니까? – Jonathan

+0

Jonathan : 변경 가능한 배열을 유지하려면 인스턴스 변수에 직접 할당하십시오. 인스턴스 변수의 복사본을 만들어 할당하지 마십시오. 당신의 질문에있는 코드는 복사본을 만들고 (즉,'copy'가하는 것입니다.) 인스턴스 변수에 복사본을 저장하고 바닥에 원본을 드롭합니다. 메모리 관리 규칙을 다시 읽어야합니다. http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html –