일반적으로 정적 클래스와 사전을 사용하여 클래스의 룩업 테이블을 포함합니다. 그러나, 클래스의 수를 신속하게 수백 들어온다, 나는이 패턴을 사용하여 계속 주저하고 있습니다. 이러한 정적 컬렉션을 느리게 초기화하더라도 누군가가 내 앱을 사용함에 따라 기본적으로 제한된 메모리 누수가 발생합니다.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의 구현은 간단합니다. 객체를 가져 와서 세트로 유지하는 메소드로 싱글 톤 클래스를 만듭니다. 그 싱글 톤에게 메모리 부족 경고를 듣게하고, 경고 메시지를 받으면 그 세트의 모든 객체를 해제하십시오. 수동 해제 기능을 추가 할 수도 있습니다.
아, 나는 이것을 좋아한다. 나는 흥미로운 솔루션을 가지고 있다고 생각한다 ... 나는 메모리 경고가 수신 될 때만 해제하는 NSObject의 카테고리를 통해 내 자신 만의 장기 자동 풀 풀을 만들 것이라고 믿는다. 지연로드 된 객체에서 사용하기 때문에 현재 시나리오를 표시하기에 충분한 메모리가 장치에 없으면 모든 종류의 쓰레기가 발생하지 않습니다. 원래 질문에 코드 예제를 추가하겠습니다. 감사! – DougW