programing

NSUserDefaults가 NSMutableDictionary를 iOS에 저장하지 못한 이유는 무엇입니까?

subpage 2023. 4. 14. 21:43
반응형

NSUserDefaults가 NSMutableDictionary를 iOS에 저장하지 못한 이유는 무엇입니까?

저장하려고 합니다.NSMutableDictionary에 반대하다.NSUserDefaults. 의 키 입력NSMutableDictionaryNSString값 유형은 다음과 같습니다.NSArray이 목록에는 를 구현하는 오브젝트 목록이 포함되어 있습니다.NSCoding. 문서당NSString그리고.NSArray둘 다에 준거하고 있다NSCoding.

다음 오류가 발생하였습니다.

[NSUserDefaults setObject: forKey:] :속성 값이 아닌 값을 삽입하려고 했습니다...NSCFDirectionary 클래스의

저장하기 전에 루트 오브젝트를 인코딩하는 방법이 하나 있습니다.NSArray오브젝트)의 사용NSKeyedArchiver로 끝납니다.NSData그런 다음 UserDefaults를 사용하여 저장한다.NSData.

데이터가 필요할 때, 저는 그 정보를 읽습니다.NSData, 및 사용NSKeyedUnarchiver개종하다NSData오브젝트로 돌아갑니다.

변환이 필요하기 때문에 조금 번거롭습니다.NSData매번 하지만, 효과가 있어요.

다음은 요청당 하나의 예를 제시하겠습니다.

저장:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];

로드:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

어레이의 요소가 구현됨

@interface CommentItem : NSObject<NSCoding> {
    NSString *value;
}

그 후, 의 실장에서는,CommentItem에는 다음 두 가지 방법이 있습니다.

-(void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:value forKey:@"Value"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    self.value = [decoder decodeObjectForKey:@"Value"];
    return self;
}

더 나은 해결책을 가진 사람?

여러분 감사합니다.

개체를 사용자 기본값으로 저장하는 경우 모든 개체는 반복적이고 완전히 다운된 속성 목록 개체여야 합니다.NSCoding을 따르는 것은 여기서 아무 의미가 없습니다.NSUserDefaults로 자동적으로 부호화되지 않는다.NSData직접 하셔야 합니다."실장하는 오브젝트 리스트"가NSCoding"는 속성 목록 개체가 아닌 개체를 의미하므로 사용자 기본값으로 저장하기 전에 속성 목록 개체를 사용하여 작업을 수행해야 합니다.

참고로 속성 리스트클래스는NSDictionary,NSArray,NSString,NSDate,NSData,그리고.NSNumber. 가변 서브클래스를 작성할 수 있습니다(예:NSMutableDictionary)는 사용자 기본 설정에 적용되지만 읽어내는 오브젝트는 항상 불변합니다.

모든 키가 사전에 있습니까?NSStrings? 사전을 속성 목록에 저장하기 위해서는 그렇게 해야 한다고 생각합니다.

가장 간단한 답변:

NSDictionary키가 NSStrings일 경우 는 플리스트 오브젝트일 뿐입니다.「키」를 다음과 같이 보존합니다.NSString와 함께stringWithFormat.


해결책:

NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];

이점:

  1. String-Value가 추가됩니다.
  2. 변수 값이 다음과 같은 경우 Empty-Value가 추가됩니다.NULL.

이 기능을 도입하는 것을 검토하고 있습니까?NSCoding프로토콜?이것에 의해, iPhone 에서는, 다음의 2개의 간단한 방법으로 부호화 및 복호화할 수 있습니다.NSCoding. 먼저 다음 명령어를 추가해야 합니다.NSCoding를 클릭합니다.

다음은 예를 제시하겠습니다.

이것은 .h 파일에 있습니다.

@interface GameContent : NSObject <NSCoding>

그런 다음 NSCoding 프로토콜의 두 가지 방법을 구현해야 합니다.

    - (id) initWithCoder: (NSCoder *)coder
    {
        if (self = [super init])
        {
               [self setFoundHotSpots:[coder decodeObjectForKey:@"foundHotSpots"]];
        }
        return self;
    }

    - (void) encodeWithCoder: (NSCoder *)coder
    {
           [coder encodeObject:foundHotSpots forKey:@"foundHotSpots"];
    }

자세한 내용은 NSCoader 문서를 참조하십시오.이 기능은 응용 프로그램이 닫혔을 때 iPhone에 응용 프로그램 상태를 저장하고 다시 켜졌을 때 원래 상태로 복원해야 하는 제 프로젝트에 매우 유용합니다.

한 것은 을 추가하고 그 두 가지 입니다.NSCoding.

도움이 됐으면 좋겠네요!

이보다 더 좋은 해결책은 없다.또 다른 옵션은 코드화된 개체를 디스크에 저장하는 것입니다. 그러나 이 방법은 동일합니다.둘 다 NSData로 종료되며, NSData는 필요할 때 디코딩됩니다.

언급URL : https://stackoverflow.com/questions/471830/why-nsuserdefaults-failed-to-save-nsmutabledictionary-in-ios

반응형