Objective c NSMutableArray不是';不要添加我的字符串

Objective c NSMutableArray不是';不要添加我的字符串,objective-c,memory-management,nsstring,nsmutablearray,nsuserdefaults,Objective C,Memory Management,Nsstring,Nsmutablearray,Nsuserdefaults,我正在尝试将一个NSString添加到NSMutableArray中,然后将该数组放入NSData中,并使用NSUserDefaults保存它。但数组始终为零 这是我的密码: - (void)viewDidLoad { [super viewDidLoad]; library = [[ALAssetsLibrary alloc] init]; groups = [[NSMutableArray alloc] init]; userDefaults = [[NSUs

我正在尝试将一个
NSString
添加到
NSMutableArray
中,然后将该数组放入
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

为什么会发生这种情况

userDefaults = [[NSUserDefaults alloc] init];
NSData *data = [userDefaults objectForKey:@"GroupArray"];
在这种情况下,第一次执行代码时,
data
将为
nil
,因为还没有“GroupArray”属性

groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
这会导致
groups
也变成
nil
,因为使用
nil
作为参数调用
unarchiveObjectWithData:
也会返回
nil

正因为如此,在
-newFolder
中,
[groups addObject:string]
变成了
[nil addObject:string]
在Objective-C中允许对
nil
调用一个方法,所以在那里没有例外。在
nil
上调用的任何方法的返回值也是
nil
0

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];
这导致
数据
nil
,因为组为
nil

所以你总是打电话:

[userDefaults setObject:data forKey:@"GroupArray"];
使用
data=nil

快速修复:
添加
if(groups==nil)groups=[NSMutableArray]
NSData*data=[userDefaults objectForKey:@“GroupArray”];在新创建的对象上

它将始终返回nil,因为在新实例中,键@“GroupArray”没有任何对象。而是将userDefaults替换为singleton对象[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];
 }

这应该行得通。它对我起作用。

什么是[userDefaults objectForKey:@“GroupArray”]包含的组=[[NSMutableArray alloc]initWithArray:[userDefaults objectForKey:@“GroupArray”];如果[userDefaults objectForKey:@“GroupArray”]返回一个数组[NSKeyedUnarchiveObjectWithData:data];dosen没有真正返回数组+组=[[NSMutableArray alloc]init];然后groups=[NSKeyedUnarchiver unarchiveObjectWithData:data];没有道理。