0

我试图将 a 添加NSString到 anNSMutableArray然后将数组放入NSData并使用NSUserDefaults. 但数组始终为零。

这是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    library = [[ALAssetsLibrary alloc] init];
    groups = [[NSMutableArray alloc] init];
    userDefaults = [[NSUserDefaults alloc] init];

    NSData *data = [userDefaults objectForKey:@"GroupArray"];

    groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"%i", [groups count]);
}

-(IBAction)newFolder {
    if (textField.text != nil) {
        NSString *string = textField.text.capitalizedString;
        [library addAssetsGroupAlbumWithName:string
                    resultBlock:^(ALAssetsGroup *group) {
                        NSLog(@"Created a folder named: %@", group);
                    }
                    failureBlock:^(NSError *error) {
                        NSLog(@"An error occured! - %@", error);
                    }
         ];
        [groups addObject:string];
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];
        [userDefaults setObject:data forKey:@"GroupArray"];

        NSLog(@"%i", [groups count]);
    }
    [self.view sendSubviewToBack:subView];
}

当应用程序启动时,我在控制台中收到一条消息,指出数组是NULL. 当我尝试添加字符串时,NSLog(@"%i", [groups count]);总是返回 0。

为什么会这样?

4

2 回答 2

1
userDefaults = [[NSUserDefaults alloc] init];
NSData *data = [userDefaults objectForKey:@"GroupArray"];

在这种情况下,data将是nil第一次执行代码时,因为还没有“GroupArray”属性存在。

groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];

这也会导致groupsbe become ,nil因为作为参数调用也会返回。unarchiveObjectWithData:nilnil

正因为如此,在-newFolder,中[groups addObject:string]变成了在 Objective-C 中[nil addObject:string] 调用方法nil是允许的,所以你不会有任何异常。调用的任何方法的返回值nil都是,再次,nil0

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];

datanil因为 groups 是nil.

所以你总是打电话:

[userDefaults setObject:data forKey:@"GroupArray"];

data = nil

快速修复:添加if (groups == nil) groups = [NSMutableArray array];到开头-newFolder

于 2013-05-08T07:27:17.013 回答
0

在每次初始化 NSUserDefaults 的新实例并调用时查看didLoad方法

NSData *data = [userDefaults objectForKey:@"GroupArray"]; 在新创建的对象上

这将一直返回 nil,因为在新实例中不会有任何对象用于键 @“GroupArray”。而是将userDefaults替换为单例对象[NSUserDefaults standardUserDefaults]

修改您的代码,如下所示

- (void)viewDidLoad 
{
     [super viewDidLoad];
     library = [[ALAssetsLibrary alloc] init];
     NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"GroupArray"];

     groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
     if (!groups)
     {
         groups = [[NSMutableArray alloc] init];    
     }
     NSLog(@"group %@", groups);
     NSLog(@"%i", [groups count]);
}     

你的 newFolder 方法

  -(IBAction)newFolder 
  {
     if (textField.text != nil) 
     {
          NSString *string = textField.text.capitalizedString;
         [library addAssetsGroupAlbumWithName:string
                     resultBlock:^(ALAssetsGroup *group) {
                         NSLog(@"Created a folder named: %@", group);
                     }
                     failureBlock:^(NSError *error) {
                         NSLog(@"An error occured! - %@", error);
                     }
          ];
        [groups addObject:string];
         NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];

        [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"GroupArray"];
        [[NSUserDefaults standardUserDefaults] synchronize];

         NSLog(@"%i", [groups count]);
     }
     [self.view sendSubviewToBack:subView];
 }

这应该有效。因为它对我有用。

于 2013-05-08T09:02:59.320 回答