2012-04-05 3 views
1

~ 50MB라고하는 NSData 객체를 NSUserDefaults에 저장하는 것이 좋지 않은 이유가 있습니까?NSData 크기 및 NSUserDefaults

documentation에는 아무 것도 없지만 NSUserDefaults가 사용되는 것을 볼 때마다 대개 소량의 데이터가 필요합니다. 나는 NSUserDefaults에 저장하는 것이 파일에 저장하는 것보다 간단하다는 것을 보여 주므로 가능한 경우 사용하고 싶습니다. NSUserDefaults 매장으로

답변

1
  1. 은 속성 목록으로 개체를, 그래서 텍스트 (XML) -format의 PLIST 아닌 바이너리를 사용할 가능성이있다. 이 경우 NSData는 실제 크기의 2 배인 int 설명을 파일의 16 진수 표현 (더하기 스페이스 패딩 등)으로 보냅니다.

  2. 그것은 개념적으로 오용되거나 남용되었습니다. 사용자 기본값은 음, 사용자의 기본값입니다. 즉, 전체 파일이 아닌 기본 설정/설정을 저장하는 데 사용해야합니다. 파일 처리 API (C stdio 함수, NSFileHandle 등)의 작업입니다.

희망이 있습니다.

1

50MB의 이진 데이터를 속성 목록으로 /로부터 변환하는 것은 매우 비효율적이므로. 이러한 경우 직접 파일 입출력 만이 정상적인 선택입니다.

1

앱의 NSUserDefaults 도메인이 XML 속성 목록으로 디스크에 기록됩니다. XML plist에 NSData가 포함되어 있으면 데이터는 16 진수 (가독성을 위해 일부 공백 추가)로 표시됩니다. 데이터의 각 바이트는 텍스트의 두 문자가되므로 50MB 데이터는 100MB가됩니다.

속성 목록은 임의 액세스 파일이 아닙니다. 사용자 (또는이 경우 Apple에서 구현 한 NSUserDefaults)가 디스크의 속성 목록에서 값을 읽으려는 경우 전체 파일을 읽고 구문 분석하여 NSDictionary. 변경 한 내용을 디스크에 저장하려면 전체 사전이 일련 화되고 파일에 기록됩니다. 따라서 읽기 및 구문 분석 또는 직렬화 및 쓰기 작업은 100MB 파일의 경우 1KB 파일보다 훨씬 오래 걸립니다. 이는 을 내부적으로 사용하기 때문에 Apple 프레임 워크의 어떤 코드가 -[NSUserDefaults synchronize]으로 호출 될 때마다 발생하며 앱의 수명주기 동안 여러 번 발생할 수 있습니다.

이미 NSData가있는 경우 파일에 직접 입력하는 것이 어렵지 않습니다. 그게 -[NSData initWithContentsOfFile:] 및을위한 것입니다. (응용 프로그램의 docs 디렉토리에서 읽기/쓰기 경로를 얻는 데는 한 줄 또는 두 줄 밖에 없습니다. 예를 들어 Xcode 프로젝트 템플릿을 참조하십시오.)

0

그리고 사용자의 기본값에 액세스하는 다른 응용 프로그램은 당신의 100 MBytes를 읽고 파싱 할 시간.