0

私はこのようにNSuserdefultsに配列を読み書きしています:

indexDelete = button.tag;

                    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
                    NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"save"];
                    if (dataRepresentingSavedArray != nil)
                    {
                        NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
                        if (oldSavedArray != nil)
                            myIntegers = [[NSMutableArray alloc] initWithArray:oldSavedArray];
                        else
                            myIntegers = [[NSMutableArray alloc] init];
                    }

                    [myIntegers addObject:[NSNumber numberWithInteger:indexDelete]];

                    NSLog (@"Array myIntegers: %@", myIntegers);

                    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myIntegers] forKey:@"save"];

私がラインを維持すれば、すべてがうまくいきます:

myIntegers = [[NSMutableArray alloc] init];

データがそこにある場合でも、正しく書き込まれたり読み取られたりしないため、括弧から外れます。

このエラーが発生します:-[NSKeyedUnarchiver initForReadingWithData:]:データがNULLです

私は何を間違っているのですか?

4

3 に答える 3

1

これを変える:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myIntegers] forKey:@"save"];

[[NSUserDefaults standardUserDefaults] setObject:myIntegers forKey:@"save"];

myIntegersが将来変更(変更)されない場合。変更される場合は、以下を使用してください。

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:myIntegers] forKey:@"save"];

配列と辞書をユーザーのデフォルトで保存する機能は、クラスの説明に記載されています。

于 2012-08-22T12:18:50.323 に答える
0

これを行うための1つの代替手段は、mutablearrayをdoc dirに保存してから、それを取得することです。

// Get path to documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
if ([paths count] > 0)
{
    // Path to save array data
    NSString  *arrayPath = [[paths objectAtIndex:0]
                            stringByAppendingPathComponent:@"array.out"];

    // Write array
    [yourMutableArray writeToFile:arrayPath atomically:YES];


    // Read both back in new collections
    NSMutableArray *arrayFromFile = [NSMutableArray arrayWithContentsOfFile:arrayPath];        
    for (NSString *element in arrayFromFile) 
        NSLog(@"Items: %@", element);

}
于 2012-08-22T10:22:15.163 に答える
0

を初期化することはありませんmyIntegerssaveデフォルトからキーのオブジェクトを初めて取得すると、オブジェクトが取得されnilます(したがって、ifクロージャを入力せず、構造を割り当てません)。その後、nilオブジェクトをアーカイブしようとします。これが、発生しているエラーの原因である可能性があります。

この前に配列の初期化を移動し、前の保存からのオブジェクトが存在する場合にのみ追加してみてください。

myIntegers = [[NSMutableArray alloc] init];
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"save"];
if (dataRepresentingSavedArray != nil)
{
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
        [myIntegers addObjectsFromArray:oldSavedArray];
}
于 2012-08-22T10:23:53.890 に答える