2010-11-27 7 views
0

내 응용 프로그램은 URL에서 특정 순서로 이미지를 다운로드하고 사용자가 이미지를 봅니다. 다음 이미지를 미리로드하고 이전 이미지를 캐시에 유지하는 앱이 있습니다.메모리가 올바르게 해제되지 않았습니까?

이 캐시는 기본적으로 이미지 ID와 연결된 키가있는 NSMutableDictionary입니다. 캐시의 각 객체는 url, 이미지 URL, 제목 및 NSData 객체가있는 NSDictionary입니다. 이미지를 다운로드 할 때 해당 요소가있는 캐시에 새 사전 개체를 추가합니다. 다음과 같이 NSData 객체를 저장합니다. NSData * imgData = [[NSData alloc] initWithContentsOfURL : [NSURL URLWithString : imageurl]]; 그런 다음이 객체를 자식 사전 객체에 추가합니다.

많은 수의 사진을 저장하고 캐시 한 후에 많은 양의 RAM을 차지하므로 분명히 전체 캐시를 지워 메모리 경고에 응답합니다. 문제는 내가 시도한 것이 든 아무런 RAM도 해제되지 않는다는 것입니다. 객체는 사라지지만 RAM을 돌려주지는 않습니다.

  • 하위 사전에서 데이터 객체를 해제 한 다음 모든 항목이 반복되면 모든 캐시 사전 하위 객체를 제거합니다.
  • , 캐시 사전을 통해 반복 자식 사전을 방출 완료되면 모든 개체를 제거
  • (여전히 사용 할 필요가 있기 때문에, 그것을 다시 다음) 그렇다하더라도 전체 캐시 개체를 해제, 모든 개체를 제거
  • 그리고 해제, 제거 등의 다른 무작위 조합.

문제는, 아무 것도 시도해 본 결과 RAM이 해제되지 않았습니다. NSData 객체의 메모리를 해제 할 때 잘못된 점이 있습니까?

+0

데이터를 다운로드 할 때 사용하는 캐시 정책은 무엇입니까? 메모리가 누출되거나 버려 졌음을 확인 했습니까 (예 : 누수 또는 할당)? –

+0

저는 실제로 iOS SDK에 내장 된 캐싱을 사용하고 있지 않습니다. NSData 객체로 채워진 NSDictionary로 내 자신을 관리하고 있습니다. 사전에서 모든 개체를 제거 할 때마다 메모리가 해제되지 않습니다. 이 메모리가 정확히 어디에 할당되었는지는 모르겠지만 원하는대로 해제되지는 않습니다. –

답변

1

Objective-C에서 메모리 관리가 작동하는 방식은 alloc/initing, -retaining 또는 -copying을 통해 객체에 대한 소유권을 얻고 더 이상 -release 또는 -autorelease를 통해 객체를 필요로하지 않을 때이를 닫습니다.

싶은 것은 :

1) 데이터 당신은 지금 객체 imgData 포인트를 소유

NSData *imgData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageurl]]; 

객체 만듭니다.

2) 자녀 사전

[childDictionary setObject:imgData forKey:@"imgData"]; 

3) 데이터 오브젝트를 해제 해당 개체를 추가합니다. 더 이상 필요하지 않습니다. childDictionary가 필요하지만 문제는 아닙니다. childDictionary는 다른 모든 객체와 마찬가지로 자체 메모리 및 소유권을 관리합니다. 당신이 할 수

[imgData release]; 

또 다른 방법은 데이터 객체의 오토 릴리즈 버전을 생성하고, dictioary에 그를 추가합니다.

다음으로 childDictionary의 메모리와 cache의 메모리를 올바르게 관리하고 있는지 확인해야합니다. 예를 들어 :

1)는 오토 릴리즈 childDictionary

NSMutableDictionary *childDictionary = [NSMutableDictionary dictionary]; 

2) 우리가 전에했던 것처럼) (childDictionary에

3 물건을 추가) 캐시

[cache setObject:childDictionary forKey:yourKey]; 

에 childDictionary 추가 만들기 4) childDictionary는 자동 완성으로 생성 되었기 때문에 필요하지 않으므로 릴리스하지 않아도됩니다. 나중에 자동 풀 풀에 의해 자동으로 해제됩니다. 당신이 사용하여 childDictionary 생성 한 경우 : 1의 retainCount와 객체를 반환

NSMutableDictionary *childDictionary = [[NSMutableDictionary alloc] init]; 

을, 당신은 지금 소유권을 해제하는 데 필요한 것 :

[childDictionary release]; 

지금까지 캐시가 간다, 당신 아마 이를 오랫동안 유지하고 싶습니다. 캐시를 관리하는 객체의 인스턴스 변수 일 가능성이 높으며 메모리 경고가 발생하면 [cache removeAllObjects]으로 재설정됩니다.

가비지 수집을 사용하여 Mac에서 개발하는 경우이 모든 작업은 쓸모가 없습니다. 그러나 전화를 사용하고 있으므로 메모리 관리에 대한 간단한 규칙을 알아야합니다. 제 설명은 당신이 익숙해야 할 많은 개념을 간과하기 때문에 the Apple documentation about this을 읽어 보시기 바랍니다.

0

이 누수를 보여주는 간단한 코드 샘플이 유용 할 것입니다. 귀하의 설명에서, imgData를 사전에 추가하는 데 사용하는 호출이 그것을 유지할 수 있습니까? 자신의 코드에서 즉시 imgData를 해제하지 않으면 보유 개수가 2가됩니다. 로컬 imgData 포인터가 범위를 벗어나면 메모리 누출이 발생합니다. 이것은 코드 샘플없이 어둠 속에서 단지 찌르기입니다.

관련 문제