2010-05-13 1 views
1

일반적으로 정적 클래스와 사전을 사용하여 클래스의 룩업 테이블을 포함합니다. 그러나, 클래스의 수를 신속하게 수백 들어온다, 나는이 패턴을 사용하여 계속 주저하고 있습니다. 이러한 정적 컬렉션을 느리게 초기화하더라도 누군가가 내 앱을 사용함에 따라 기본적으로 제한된 메모리 누수가 발생합니다.static, lazily loaded 사전 및 배열의 ​​메모리로드를 관리하는 방법

이들의 대부분은 그래서 난 그냥 모든 호출에 배열/사전을 다시 만들 수

스위치 문 사용할 수 있습니다 NSInteger 상수 등으로 문자열을 변환 할 수있는 문자열의 배열이 있지만, 이러한 기능의 많은 무겁게 및/또는 타이트한 루프에서 사용된다.

그래서 성능이 좋고 지속성이없는 패턴을 찾으려고합니다.

정보를 plist에 저장하면 iphoneOS가로드 될 때 정보를 캐싱하는 데 지능이 있습니까?

다른 관련 방법이 있습니까?

편집 - 솔루션을 기반으로

답변의 예는 여기에 내가 ...

첫 번째 작업 카테고리를 통해 NSObject의에 메소드를 추가거야 무슨, 아래에 제안했다.

- (id)someHelperFunction:(id)lookupKey { 
    static NSDictionary *someLookupDictionary = nil; 
    if (!someLookupDictionary) { 
     someLookupDictionary = [[NSDictionary dictionaryWithObjects:X, Y, Z, nil] autoreleaseOnLowMemory]; 
    } 
    return [someLookupDictionary objectForKey:lookupKey]; 
} 

지금은 도우미 함수, 난 그냥 다음과 같은 패턴을 사용할 수 있습니다 게으른 로딩 정적 배열 또는 사전을 만들 때마다 이제

- (void)autoreleaseOnLowMemory; 

, ..., 대신 정적 사전 프로그램이 끝날 때까지 살면서, 우리는 메모리 부족으로 풀려 나면 다시 필요할 때만 다시 인스턴스화됩니다. 그리고 네, 아이폰에서 실행되는 대규모 프로젝트에서 이것은 중요 할 수 있습니다!

PS - autoreleaseOnLowMemory의 구현은 간단합니다. 객체를 가져 와서 세트로 유지하는 메소드로 싱글 톤 클래스를 만듭니다. 그 싱글 톤에게 메모리 부족 경고를 듣게하고, 경고 메시지를 받으면 그 세트의 모든 객체를 해제하십시오. 수동 해제 기능을 추가 할 수도 있습니다.

답변

2

필자는 일반적으로 코드의 다른 섹션에서 유지 관리하고 재사용하기 쉽기 때문에 이것을 선호합니다. 파일에서 NSDictionary로로드하는 속도가 걱정되면 (그리고 프로파일 러를 확인하십시오) 항상 메모리 경고를 받으면 인스턴스 변수에 넣을 수 있습니다.

+0

아, 나는 이것을 좋아한다. 나는 흥미로운 솔루션을 가지고 있다고 생각한다 ... 나는 메모리 경고가 수신 될 때만 해제하는 NSObject의 카테고리를 통해 내 자신 만의 장기 자동 풀 풀을 만들 것이라고 믿는다. 지연로드 된 객체에서 사용하기 때문에 현재 시나리오를 표시하기에 충분한 메모리가 장치에 없으면 모든 종류의 쓰레기가 발생하지 않습니다. 원래 질문에 코드 예제를 추가하겠습니다. 감사! – DougW

0

문자열 만 수행하는 경우 C 배열을 사용할 수 있습니다.

id keys[] = { @"a" , @"b" , @"c" }; 
id values[] = { @"1" , @"2" , @"3" }; 

그리고 당신은 가끔 그에서 진정한있는 NSArray 나 NSDictionary에 필요한 경우 다음 PLIST는 각각의 컬렉션에 대한 분석 디스크 히트와 XML을 포함 할 것이다

[NSArray arrayWithObjects:values count:3]; 
[NSDictionary dictionaryWithObjects:values forKeys:keys count:3]; 

합니다. 내가 아는 한 NSUserDefaults 만 캐시됩니다.

+0

이 답변에 문제가 없습니다. 객체가 래핑 된 배열을 가지지 않기 위해 오버 헤드가 약간 줄어들지 만 크게는 아닙니다. 다시 한번 말하지만 나쁜 아이디어는 아닙니다. 다른 해결책이 제 요구에 더 잘 맞다고 생각합니다. – DougW

관련 문제