NSMutableArray не добавляет мою строку NSString
Я пытаюсь добавить 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.
Почему это происходит?
2 ответа
userDefaults = [[NSUserDefaults alloc] init];
NSData *data = [userDefaults objectForKey:@"GroupArray"];
В этом случае, data
будет nil
когда код выполняется в первый раз, так как еще нет свойства "GroupArray".
groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Это вызывает groups
стать nil
а потому что зовет unarchiveObjectWithData:
с nil
в качестве аргумента вернется nil
также.
И из-за всего этого, в -newFolder
, [groups addObject:string]
становится [nil addObject:string]
Вызов метода на nil
разрешено в Objective-C, так что вы не получите никаких исключений. Возвращаемое значение любого вызванного метода nil
опять же nil
или же 0
,
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];
Это вызывает data
быть nil
потому что группы это nil
,
Итак, вы всегда звоните:
[userDefaults setObject:data forKey:@"GroupArray"];
с data = nil
Быстрое исправление: Добавить if (groups == nil) groups = [NSMutableArray array];
к началу -newFolder
По мнению метода didLoad каждый раз, когда вы инициализируете новый экземпляр NSUserDefaults и вызываете
NSData *data = [userDefaults objectForKey:@"GroupArray"]; на вновь созданном объекте
который будет возвращать ноль все время, потому что в новом экземпляре не будет никакого объекта для ключа @"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];
}
Это должно работать. Как это у меня сработало.