Program Tip

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

programtip 2020. 11. 27. 21:11
반응형

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


저는 iPhone 개발 및 objective C. NSUserDefaults내 앱에 일부 값을 저장하는 데 사용 되었습니다. 하지만 .NET에 값을 저장하는 데 제한이 있는지 모르겠습니다 NSUserDefaults. 누구든지 나를 알도록 도울 수 있습니까?

미리 감사드립니다.


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


당신이 저장할 수 있습니다 어떤 종류에 제한이 있습니다 : 그들은 모든 속성 목록 객체, 즉해야한다 NSString, NSNumber, NSData, NSArray,와 NSDictionary. 또한, 만 저장할 수 NSArrayNSDictionary값도 재산 목록 개체 경우; 또한의 모든 키는 NSDictionary문자열이어야합니다.

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

크기 제한에 관해서는 문서화 된 것이 없지만 모든 데이터는 속성 목록 파일로 저장됩니다. 전체 파일을 읽고 쓰기 때문에 NSUserDefaults부분적으로 만 변경되는 많은 양의 데이터를 저장하는 데 사용 하면 불필요한 I / O를 수행하는 데 많은 시간을 낭비하게됩니다.


모두가 "제한이 있습니까?"라는 직접적인 질문에 답했습니다. 그러나이 스레드 "UserDefaults에 저장하기에 너무 많은 양 "을 정말로 이해 하려고합니다.

그 답을 찾고 있다면 여기 유용한 스레드가 있습니다. 내가 도움이 된 응답은 프로젝트 파일로 이동하여 plist 파일 크기를 확인하는 것이 었습니다.

5 개의 물체는 거의 아무것도 아닙니다. 너는 괜찮아 질거다!


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


배열에 대한 일반적인 프로그래밍 경험에서 나는 요소 크기에 따라 1000 대에 도달하면 성능이 빠르게 저하되기 시작한다고 생각합니다. 따라서 프로그램에서 수백 개의 요소를 저장하는 데 문제가 없습니다. 이것은 내가 당신이라면 나중에보다 더 빨리 sqlite3 데이터베이스 또는 coredata를 사용하기 시작할 것이라고 말했습니다.

기억해야 할 중요 사항 :

위의 내용은 점점 늘어나는 기본값 (현재 약 20-25 개)이 문제를 일으킬 것이라는 우려를 완화했습니다. 이미 CoreData를 사용하고 있기 때문에 허용 된 사용자 기본 설정 / 사용자 지정 수가 늘어나고 있기 때문에 어떤 것을 사용할지 고려하고있었습니다. 따라서 사용자 기본값을 유지하겠습니다.

그러나 다른 답변에서 지적했듯이 파일은 전체적으로 읽고 작성됩니다. 따라서 하나의 문자열을 검색하기 위해 20 개의 키 / 문자열 사전과 5 개의 키 / 부울 사전을 읽는 것은 이상적이지 않습니다. 그럼에도 불구하고 성능을 해치지 않고 많은 코드를 절약한다면 왜 안 될까요?


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


유일한 스토리지 제한 에가 NSUserDefaults는 IS 장치 저장 용량 .

장치사용 가능한 저장 공간 이있는만큼 실제로 데이터를 . - 쌍은 XML 구성 파일 (.에 저장된 PLIST 에 저장된다) 애플리케이션 번들 .iOS NSUserDefaults

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


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. tvOS 경고 알림이 512KB에 게시 될 것입니다, 그리고 1메가바이트에서 종료하는 과정.
  3. 유비쿼터스 기본값의 경우 제한은 로그인 한 iCloud 사용자에 따라 다릅니다.

이미 언급했듯이 .plist (예 : UserDefaults)에 데이터를 저장하기위한 크기 제한 (실제 메모리 제외)을 알지 못합니다. 따라서 얼마나 많은가에 대한 질문이 아닙니다.

진짜 질문은 얼마나 자주 새 값 / 변경된 값을 쓰는가입니다 ... 그리고 이것은이 쓰기로 인한 배터리 소모와 관련이 있습니다.

IOS는 데이터 무결성을 유지하기 위해 단일 값이 변경된 경우 "디스크"에 물리적 쓰기를 피할 기회가 없습니다. UserDefaults와 관련하여 전체 파일이 디스크에 다시 쓰여집니다.

이렇게하면 "디스크"에 전원이 공급되고 더 오랜 시간 동안 전원이 켜진 상태로 유지되며 IOS가 저전력 상태로 전환되는 것을 방지합니다.

From "Energy Efficiency Guide for iOS Apps":

Minimize data writes. Write to files only when their content has changed, and aggregate changes into a single write whenever possible. Avoid writing out an entire file if only a few bytes have changed. If you frequently change small portions of large files, consider using a database to store the data instead.

READS are no problem, as all values are cached in memory.

EDIT: (July 2019): I just found this very good blog post by Jeffry Fulton.

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

He describes in detail the different aspects of the user defaults and also writes about some performance tests.


As far as my knowledge there is no limit for storing in NSUserdefaults.


It whatever the maximum allowed file size is on the drive. You can use this piece of code to check it out!

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);
}

As of iPadOS 13.1 beta 3, I'm now seeing the following message when trying to store a larger object (an image).

2019-09-14 11:01:29.634368+0100 MyApp[1686:147223] [User Defaults] CFPrefsPlistSource<0x283c7d980> (Domain: com.example.MyApp, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): Attempting to store >= 4194304 bytes of data in CFPreferences/NSUserDefaults on this platform is invalid. This is a bug in MyApp or a library it uses

However retrieving the key appears to still work.

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

반응형