문제

이 메소드를 호출 할 때마다 NSMutabledata가 누출되어 있으며 플러그를 꽂는 방법을 알 수 없습니다. 디코더가 할당되어 초기화 된 후 Thedata의 유지 카운트가 1 명으로 올라갑니다. 왜 그런지 모르겠습니다. 방법의 끝에 2의 유지 수를 고수하고 해제하려고 시도하면 앱 충돌이 발생합니다.

- (void)readVenueArchiveFile:(NSString *)inFile key:(NSString *)inKey
{
    NSMutableData *theData;
    NSKeyedUnarchiver *decoder;


    theData = [NSData dataWithContentsOfFile:inFile];

    decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData];

    venueIOList = [[decoder decodeObjectForKey:inKey] mutableCopy];

    [decoder finishDecoding];

    [decoder release];
}
도움이 되었습니까?

해결책

이 라인을 교체하는 것이 좋습니다.

venueIOList = [[decoder decodeObjectForKey:inKey] mutableCopy];

와 함께:

ListClassName *decodedList = [decoder decodeObjectForKey:inKey];
self.venueIOList = decodedList;

이것은 메모리 관리를 만듭니다 decodedList 분명한. 액세서 방법을 사용하여 인스턴스 변수를 할당하는 것이 모범 사례로 간주됩니다 (INIT 메소드 제외). 현재 구현에서 호출 한 경우 readVenueArchiveFile: 같은 대상에서 두 번째로 ~ 할 것이다 누출 (그렇듯이 decodedList 이미 가치가 있습니다). 또한, 사본 로직을 액세서 메소드에 넣고 새 값을 할당 할 때마다 MutableCopy를 기억하지 않고 잊어 버릴 수 있습니다 (어쨌든 변이 가능한 사본을 만들 수있는 충분한 이유가 있다고 가정).

다른 팁

피크 메모리 발자국 감소

일반적으로 자동 엘라스 객체를 생성하지 않는 것이 가장 좋은 관행으로 간주됩니다.

이 단락의 대부분은 수정되었습니다 이 질문.] 일반적으로 (1) 수명을 직접 제어 할 수 없으므로 자동 조정 객체는 비교적 오랜 시간 동안 지속될 수 있으며 불필요하게 응용 프로그램의 메모리 풋 프린트를 증가시킬 수 있습니다. 데스크탑에있는 동안 이것 5월 더 제한된 플랫폼에서는 거의 결과가되지 않습니다. 이것은 중요한 문제가 될 수 있습니다. 따라서 모든 플랫폼에서, 특히 더 제한된 플랫폼에서, 가능한 경우, 당신은 자동 입력 된 객체로 이어지는 방법을 사용하고 대신 Alloc/Init 패턴을 사용하도록 권장합니다.

나는 이것을 교체하는 것이 좋습니다 :

theData = [NSData dataWithContentsOfFile:inFile];

와 함께:

theData = [[NSData alloc] initWithContentsOfFile:inFile];

그런 다음 메소드가 끝나면 다음을 추가합니다.

[theData release];

이것은 그것을 의미합니다 theData 방법이 종료되기 전에 처리됩니다. 당신은 다음과 같이 끝나야합니다.

- (void)readVenueArchiveFile:(NSString *)inFile key:(NSString *)inKey
{
    NSMutableData *theData;
    NSKeyedUnarchiver *decoder;

    theData = [[NSData alloc] initWithContentsOfFile:inFile];
    decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData];
    ListClassName *decodedList = [decoder decodeObjectForKey:inKey];
    self.venueIOList = decodedList;
    [decoder finishDecoding];
    [decoder release];
    [theData release];

}

이렇게하면 메모리 관리 시맨틱이 명확 해지고 최대한 빨리 메모리를 되 찾습니다.

(1) 자신의 로컬 자동 제출 풀을 사용하여 통제 할 수 있습니다. 이에 대한 자세한 내용은 참조하십시오 Apple의 메모리 관리 프로그래밍 안내서.

카운트를 유지하는 것에 대해 걱정하지 마십시오. 방법 내에서 균형에 대해 걱정하십시오. 이 방법에서하고있는 일이 정확해 보입니다. venueIOList 인스턴스 변수입니다.

내 대답을 약간 확장하려면 : Unarchiver는 Unarchive 작업 중에 데이터를 유지 한 다음 데이터를 보내는 것일 수 있습니다. -autorelease 대신에 끝났을 때 -release. 그것은 무언가가 아니기 때문에 그랬어, 그것은 무언가가 아닙니다 신경 쓰야합니다.

RefCount 관련 메모리 관리 계몽의 궁극적 인 출처는 여전히 IMO입니다. "나를 안고, 나를 사용해, 나를 자유롭게 해줘" 단계적으로.

코드가 정확합니다. 메모리 누출이 없습니다.

theData = [NSData dataWithContentsOfFile:inFile];

동일합니다

theData = [[[NSData alloc] initWithContentsOfFile:inFile] autorelease];

이 시점에서 Thedata의 참조 수는 1입니다 (더 적은 경우 처리됩니다). 기준 카운트는 향후 AutoreLease 풀에 의해 향후 어느 시점에서 자동으로 감소 될 것입니다.

decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData];

디코더 객체는 참조 수를 2로 증가시키는 THEDATA에 대한 참조를 유지합니다.

메소드가 반환되면 AutorELEASE 풀은이 값을 1로 줄입니다.이 메소드의 끝에서 THEDATA를 해제하면 참조 수가 0이되고 사용하려고 할 때 객체가 처리되고 앱이 충돌합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top