NSUserDefaults NSMutable数组不在会话之间保存

时间:2010-11-08 19:34:45

标签: iphone objective-c synchronization nsmutablearray nsuserdefaults

我在NSUserDefaults中存储了一个NSMutableArray。可正确编辑可变数组,可以使用以下命令查看编辑结果:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

但是,当我退出并重新启动应用程序时,用户默认值将恢复为原始格式。

我尝试通过运行此方法来强制同步来保存状态:

-(void) saveUserDefaults{
if([[NSUserDefaults standardUserDefaults] synchronize]){
    NSLog(@"Defaults saved");
}else{
    NSLog(@"Defaults save failed");
}

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

}

有什么想法可能无法保存吗?

我在第一次运行应用程序时使用此代码设置用户默认数组:

// Check if first time run
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"isFirstRun"] isEqualToString:@"no"]) {

    // Not first run, NSUserDefault arrays are already set
}else {
    // First Run of Program 
    // Mark for future
    [[NSUserDefaults standardUserDefaults] setObject:@"no" forKey:@"isFirstRun"];


    designerArray = [[NSMutableArray alloc] initWithObjects: @"Alberta Ferretti", @"Alberto Fermani", @"Alejandro Ingelmo", @"Alexander McQueen", @"Alexander Wang", @"Ann Demeulemeester", @"Anne Klein", @"Aquatalia", @"Anya Hindmarch", @"Ash", @"Badgley Mischka Platinum Label", @"Balenciaga ", @"BCBGMAXAZRIA", @"BC Studio", @"Be & D", @"Belle by Sigerson Morrison", @"Bettye Muller ", @"Beverly Feldman", @"Botkier", @"Bourne", @"Bottega Veneta", @"Brian Atwood", @"Burberry", @"Burberry Prorsum", @"Camilla Skovgaard", @"Candela", @"Carlos Falchi", @"Casadei ", @"Chie Mihara", @"Chloe", @"Christian Louboutin", @"Claudio Merazzi", @"Coach", @"Cole Haan", @"Comme des Garcons", @"Costume National", @"Cynthis Vincent", @"Delman ", @"Devi Kroell", @"Derek Lam", @"Diane von Furstenberg", @"Dior", @"Dolce & Gabbana", @"Dolce Vita", @"Donald J Pliner ", @"Donna Karan", @"Elie Tahari ", @"Elizabeth and James", @"Emilio Pucci", @"Emma Hope", @"Eric Javits", @"Fendi", @"Ferragamo ", @"Foley & Corinna", @"Frye ", @"Furla", @"Giuseppe Zanotti", @"Givenchy", @"Gucci", @"Halston Heritage", @"H by Hudson", @"Hobo International", @"House of Harlow 1960", @"Hunter", @"Jack Rogers", @"Jean Paul ", @"Jerome C. Rousseau", @"Jil Sander", @"Jimmy Choo", @"Joan & David", @"Joie", @"Jonathan Kelsey", @"Judith Leiber", @"Juicy Couture", @"Junya Watanabe", @"Kate Spade", @"Kooba", @"Kork-Ease ", @"Kors Michael Kors", @"L.A.M.B.", @"LD Tuttle", @"Le Silla", @"Lanvin", @"Lilly Pulitzer", @"Linea Pelle", @"Lockheart", @"Loeffler Randall", @"Longchamp", @"Luciano Padovan", @"Maison Martin Margiela", @"Maison Martin Margiela MM6", @"MANITOBAH MUKLUKS ", @"MANOLO BLAHNIK ", @"Marc by Marc Jacobs", @"Marc Jacobs", @"Marina Rinaldi", @"MATT BERNSON ", @"Max Kibardin", @"MCM", @"Melissa", @"Michael Kors", @"MICHAEL MICHAEL KORS", @"Milly", @"Miu Miu", @"Miss Sixty", @"Missoni", @"Modern Vintage", @"Moschino", @"Moschino Cheap and Chic", @"Nancy Gonzalez", @"Narcisco Rodriguez", @"Nina Ricci", @"Nicholas Kirkwood", @"Olivia Harris", @"Opening Ceremony", @"Oscar de la Renta", @"PATRICIA GREEN ", @"Pedro Garcia ", @"Philosophy by Alberta Ferretti", @"Pollini", @"Prada", @"Proenza Schouler", @"Pura Lopez",@"Rachel Comey ", @"Rag & Bone", @"Ralph Lauren", @"Rebecca Minkoff", @"Rene Caovilla ", @"Repetto", @"Robert Clergerie ", @"Rock & Republic", @"Rosegold", @"Rupert Sanderson", @"Salvatore Ferragamo", @"SAM EDELMAN ", @"Scorah Pattulo", @"See by Chloe", @"7 for all mankind ", @"Sergio Rossi", @"Sigerson Morrison", @"Stella McCartney ", @"Stephane Verdino", @"Steve Madden", @"Storksak", @"Stuart Weitzman", @"Studio Pollini", @"Taryn Rose", @"Thakoon", @"Theory", @"Tracy Reese", @"Tod's", @"TOMS ", @"Tory Burch", @"UGG Australia", @"Valentino", @"Vera Wang Lavender Label", @"Versace", @"Via Spiga", @"Vince Camuto", @"Yves Saint Laurent", @"Zac Posen", @"Zagliani", @"-", nil];

    [[NSUserDefaults standardUserDefaults] setObject:designerArray forKey:@"designerArray"];

    shoeStyles = [[NSMutableArray alloc] initWithObjects: @"Ankle Strap", @"Ballet Flat", @"Boot", @"Bootie", @"Buckle Strap", @"Caged", @"Cowboy Boot", @"D'Orsay", @"Espadrille", @"Flat", @"Flat Sandal", @"Lace Up Boot",@"Mary Jane", @"Mid Calf Boot", @"Open Toe Flat", @"Open Toe Pump", @"Platform", @"Strappy Sandal", @"Thigh High Boot", @"Rain Boot", @"Sling Back", @"T-Strap", @"-", nil];

    [[NSUserDefaults standardUserDefaults] setObject:shoeStyles forKey:@"shoeStyles"];

3 个答案:

答案 0 :(得分:1)

您何时调用saveUserDefaults?

我还建议在方法中只调用一次[NSUserDefaults standardUserDefaults]。只需保持指向对象的指针并一次又一次地使用它,如下所示:

NSMutableArray *designerArray = [[NSMutableArray alloc] initWithObjects: @"Alberta Ferretti" ...;

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:designerArray forKey:@"designerArray"]; [defaults synchronize];

我在设计器数组中使用了上面的代码,它对我有用。

答案 1 :(得分:1)

您的意思是将默认值设置为NSMutableArray,然后如果更改默认值之外的可变数组,则会丢失更改吗?

如果是这样,默认值可能没有注意到您已更改数组。您需要创建一个新数组并再次发送-setObject:forKey:(或使用相同的可变数组并发送-setObject:forKey:)。

顺便说一句,文档说你只能通过NSArray。这并不意味着你不能通过NSMutableArray,但你需要遵守合同的精神,而不是改变你传入的数组。

答案 2 :(得分:0)

这对我有用。我几乎不得不将数组重新分配给自己。

[standardDefaults setObject:[standardDefaults objectForKey:@"designerArray"] forKey:@"designerArray"];
相关问题