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]每次初始化NSUserDefaults的新实例并调用
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];没有道理。