1

NSUserDefaults キーの下に一連の値を保存しようとしています。カスタム クラスを使用して RSS フィードにアクセスし、フィードで見つかった情報と一致するようにクラスの変数を設定します。次に、別のクラスを使用して、NSUserDefaults キーの下に値を設定します。

[infoStorageClass dataIsNew:self];
[infoStorageClass storeData:self];

問題は、クラスを保存するたびに次の警告が表示されることです。

[NSUserDefaults setObject:forKey:]: クラス '__NSArrayM' の非プロパティ値 '( "TARSSInfo: 0x80eb6a0" )' を挿入しようとしています。プロパティ リスト内の辞書と配列にも、プロパティ値のみが含まれている必要があることに注意してください。

何が起きてる?よろしくお願いします。

4

2 に答える 2

2

ドキュメントから:

デフォルト オブジェクトはプロパティ リスト、つまり、NSData、NSString、NSNumber、NSDate、NSArray、または NSDictionary のインスタンス (またはコレクションの場合はインスタンスの組み合わせ) である必要があります。

別のタイプのオブジェクトを保存するには、まず、保存するオブジェクトのクラスに NSCoding プロトコルを実装する必要があります。つまり、これらのメソッドを実装し、次のようにデコードとエンコードを行います (カスタム クラス BMDifficultyLevel の私自身のコードのスニペット):

- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
    _difficultyLevel = [decoder decodeObjectForKey:@"difficulty"];
    _difficultyLevelType = [decoder decodeIntegerForKey:@"type"];
}
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:_difficultyLevel forKey:@"difficulty"];
[encoder encodeInteger:_difficultyLevelType forKey:@"type"];
}

次に、オブジェクトを保存する前に、アーカイブしてから次のように保存する必要があります。

 NSUserDefaults *defaults = [[NSUserDefaults alloc] init];
_defaultsDataWithLevelObject = [NSKeyedArchiver archivedDataWithRootObject:_difficultyLevel];
[defaults setObject:_defaultsDataWithLevelObject forKey:BMDifficultyLevelDefaultsKey];

ここ_defaultsDataWithLevelObjectで、 は NSData 型のオブジェクトです。つまり、最終的には NSData オブジェクトを格納します。

デフォルトを取得するには、次のようにオブジェクトを解凍する必要があります。

    _defaultsDataWithLevelObject = [[NSUserDefaults standardUserDefaults] objectForKey:BMDifficultyLevelDefaultsKey];
    _difficultyLevel = [NSKeyedUnarchiver unarchiveObjectWithData:_defaultsDataWithLevelObject];
于 2013-10-04T14:35:27.240 に答える