programing

NSUserDefaults에 값을 저장하는 데 제한이 있습니까?

telecom 2023. 10. 7. 09:25
반응형

NSUserDefaults에 값을 저장하는 데 제한이 있습니까?

는 했습니다를 이 있습니다.NSUserDefaults제 앱에 몇 가지 가치를 저장하기 위해서요.까에 하는 데 ?NSUserDefaults?

iPhone/iPad에 충분한 공간만 있으면 NSUserDefault 값을 저장할 수 있습니다.이 모든 값은 .plist 파일에 저장되며, 이 파일은 매우 작으며 대부분의 시간이 1kb 미만입니다(많은 데이터를 저장하지 않는 한).

할 수 , . , Property List ).NSString,NSNumber,NSData,NSArray,그리고.NSDictionary만 할 수 .NSArray그리고.NSDictionary키.NSDictionary문자열이어야 합니다.

는 다음과 .UIColor위 목록에 없습니다.따라서 기본 데이터베이스에 색상을 저장하려면 먼저 색상을 문자열 또는 데이터 개체로 변환한 다음 기본값을 읽을 때 다시 변환해야 합니다.

크기 제한에 관해서는 문서화된 것이 없지만 모든 데이터는 속성 목록 파일로 저장됩니다.쓸 수 때문에에를 NSUserDefaults부품만 변경되는 대량의 데이터를 저장하려면 불필요한 I/O를 수행하는 데 많은 시간을 낭비하게 됩니다.

iOS SDK 코드 및 관련 Apple 공식 문서에서..

extension UserDefaults {


    /*!
     NSUserDefaultsSizeLimitExceededNotification is posted on the main queue when more data is stored in user defaults than is allowed. Currently there is no limit for local user defaults except on tvOS, where a warning notification will be posted at 512kB, and the process terminated at 1MB. For ubiquitous defaults, the limit depends on the logged in iCloud user.
     */
    @available(iOS 9.3, *)
    public class let sizeLimitExceededNotification: NSNotification.Name


    // ....
 }   


요약

  1. 현재 로컬 사용자 기본값에 대한 제한이 없습니다.
  2. 512kB로 경고 알림이 게시되고 1MB로 프로세스가 종료되는 tvOS.
  3. 유비쿼터스 기본값의 경우 제한은 로그인한 iCloud 사용자에 따라 달라집니다.

모든 사람들이 "한계가 있는가?"라는 직접적인 질문에 답했습니다.하지만 이 스레드는 "UserDefaults에 저장할 수 있는 이 너무 많습니까?"를 정말로 이해하려고 합니다.

그 답을 찾고 계신다면, 여기 유용한 실이 있습니다.제가 도움이 되었다고 생각한 응답은 프로젝트 파일로 이동하여 plist 파일 크기를 확인하는 것이었습니다.

5개의 물건은 거의 아무것도 아닙니다.잘 될 거야!


제 컴퓨터에는 사용자 기본값에 약 28개의 데이터가 저장되어 있습니다.그것은 전혀 문제를 일으키지 않습니다.


어레이에 대한 일반적인 프로그래밍 경험으로 볼 때, 요소 크기에 따라 1000대가 되면 성능이 급격히 저하되기 시작합니다.따라서 프로그램에서 저는 몇 백 개의 요소를 저장하는 데 문제가 없을 것입니다.이것은 내가 당신이라면 아마도 sqlite3 데이터베이스나 코어 데이터를 사용하기 시작할 것이라고 말했습니다.

기억해야 할 중요 사항:

이를 통해 (현재 약 20-25건의) 증가하는 채무 불이행으로 인해 문제가 발생할 것이라는 우려가 해소되었습니다.저는 이미 CoreData를 사용하고 있기 때문에 사용자 환경 설정/사용자 지정이 길어지고 있어 어떤 것을 사용할지 고민하고 있었습니다.그래서 저는 사용자 기본값을 유지할 것입니다.

그러나 다른 답변들이 지적했듯이 파일은 전체적으로 읽고 쓸 것입니다.그래서 20개의 키/스트링 사전과 5개의 키/부울 사전을 읽고 하나의 문자열을 검색하는 것입니다.꼭 이상적이지는 않습니다.하지만 성능을 해치지 않고 코드를 많이 절약할 수 있다면 왜 안 될까요?

많은 사람들이 이미 언급한 것처럼:데이터를 .plist(예: UserDefaults)에 저장하기 위한 SIZE 제한(물리적 메모리 제외)을 알지 못합니다.그래서 얼마가 문제가 아닙니다.

진짜 문제는 얼마나 자주 새 값/변경 값을 쓰느냐 하는 것입니다.그리고 이것은 이 글을 쓸 때 발생하는 배터리 방전과 관련이 있습니다.

IOS는 데이터 무결성을 유지하기 위해 단일 값이 변경될 경우 "디스크"에 대한 물리적 쓰기를 피할 기회가 없습니다.UserDefaults의 경우 전체 파일이 디스크에 다시 기록됩니다.

그러면 "디스크"의 전원이 켜지고 더 오랫동안 전원이 켜져 있고 IOS가 저전력 상태로 가는 것을 방지할 수 있습니다.

"iOS 앱을 위한 에너지 효율 가이드"에서:

데이터 쓰기를 최소화합니다.파일 내용이 변경된 경우에만 파일에 기록하고 변경 내용을 가능한 한 한 번의 쓰기로 집계합니다.몇 바이트만 변경된 경우 전체 파일을 쓰지 않도록 합니다.대용량 파일의 작은 부분을 자주 변경하는 경우 데이터베이스를 사용하여 대신 데이터를 저장하는 것을 고려해 보십시오.

모든 값이 메모리에 캐싱되므로 READs는 문제가 없습니다.

편집: (2019년 7월):방금 Jeffry Fulton의 아주 좋은 블로그 포스트를 찾았습니다.

https://jeffreyfulton.ca/blog/2018/02/userdefaults-limitations-and-alternatives

그는 사용자 기본값의 다양한 측면을 자세히 설명하고 몇 가지 성능 테스트에 대해서도 씁니다.

해피코딩!!!

iPadOS 13.1 beta 3 기준으로 더 큰 객체(이미지)를 저장하려고 하면 다음 메시지가 나타납니다.

2019-09-14 11:01:29.634368+0100 MyApp [1686:147223] [사용자 기본] CFPrefsPlistSource<0x283c7d980> (도메인: com.exampleMyApp, User: kCFPreferencesCurrentUser, ByHost: No, Contents Need Refresh: No): >= 4194304바이트의 데이터를 이 플랫폼의 CFPreferences/NSUserDefaults에 저장하려고 하면 잘못되었습니다.MyApp의 버그 또는 MyApp에서 사용하는 라이브러리입니다.

그러나 키를 검색해도 여전히 작동하는 것 같습니다.

NSUserDefaults에 값을 저장하는 데 제한이 없습니다.

의 유일한 스토리지 제한 사항NSUserDefaultsDevice Storage Capacity 입니다.

장치에 사용 가능한 저장 공간이 있는 만큼 데이터를 저장할 수 있습니다.NSUserDefaults. 키-값 쌍은 앱 번들에 저장된 xml 구조 파일(.plist)에 저장됩니다.

사용자 기본값 시스템과 키 값 저장소는 둘 다 간단한 데이터 유형( 문자열, 숫자, 날짜, 부울 값, URL, 데이터 개체 등)을 속성 목록에 저장하도록 설계되었습니다.속성 목록을 사용하면 배열 및 사전 형식을 사용하여 기본 설정 데이터를 구성할 수도 있습니다.다른 개체를 속성 목록에 인코딩하여 저장할 수도 있습니다.NSData먼저 목적을 정합니다.

NSUser defaults에 저장하는 데 제한이 없는 것으로 알고 있습니다.

드라이브에 허용되는 최대 파일 크기가 무엇이든 간에 상관없이.이 코드를 사용해서 확인할 수 있습니다!

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *myKey = @"key";
int sizeOfFile = 1024; // Fill in proper file size here
NSData myObject;
NSString *someFilePath = @"PathToYourFileHere";

for(int i = 1; i < 9999999999999999; i++)
{
  myObject = [NSData dataWithContentsOfFile:someFilePath];
  [defaults setObject:myObject forKey:[NSString stringWithFormat:@"%@%i", myKey, i]];
  NSLog(@"Iteration: %i, TotalWritten: %i", i, i * sizeOfFile);
}

언급URL : https://stackoverflow.com/questions/7510123/is-there-any-limit-in-storing-values-in-nsuserdefaults

반응형