简体   繁体   English

NSUserDefaults setObject崩溃

[英]NSUserDefaults setObject crash

I have a singleton class, in its init method, I have setup an NSMutableArray , and later when I save it, app crashes randomly with this crash log, I am kind of sure that recordUploadCnt can't be nil, but can't find out where goes wrong. 我有一个单例类,在它的init方法中,我已经设置了NSMutableArray ,稍后当我保存它时,应用程序随该崩溃日志随机崩溃,我可以确定recordUploadCnt不能为nil,但是找不到出哪里错了。

  NSString* const KEY_SENSOR_UPLOAD = @"recordUploadCnt";
  @property(nonatomic, strong) NSMutableArray* recordUploadCnt;

- (id)init {
    if (self = [super init]) {
         NSMutableArray* cnt = [[NSUserDefaults standardUserDefaults] objectForKey:KEY_SENSOR_UPLOAD];
         self.recordUploadCnt = cnt ? [NSMutableArray arrayWithArray:cnt] :  [NSMutableArray new];
    }
    return self;
}

double currentTime = [[NSDate date] timeIntervalSince1970];
if ([self.recordUploadCnt count] < 6) {
    [self.recordUploadCnt addObject:[NSString stringWithFormat:@"%f",currentTime]];
} else {
    [self.recordUploadCnt removeObjectAtIndex:0];
    [self.recordUploadCnt addObject:[NSString stringWithFormat:@"%f",currentTime]];
}
[[NSUserDefaults standardUserDefaults] setObject:self.recordUploadCnt forKey:KEY_SENSOR_UPLOAD];
[[NSUserDefaults standardUserDefaults] synchronize];

Exception Type:  SIGSEGV
Exception Codes: SEGV_MAPERR at 0xebfecbeb8
Crashed Thread:  37
Thread 37 Crashed:
0   libobjc.A.dylib                 0x0000000184980430 _objc_msgSend :16 (in libobjc.A.dylib)
1   CoreFoundation                  0x00000001856bf4c8 __CFPropertyListIsValidAux :52 (in CoreFoundation)
2   CoreFoundation                  0x00000001856c02a4 __CFPropertyListIsArrayPlistAux :40 (in CoreFoundation)
3   CoreFoundation                  0x00000001855e3900 _CFArrayApplyFunction :80 (in CoreFoundation)
4   CoreFoundation                  0x00000001856bf5fc __CFPropertyListIsValidAux :360 (in CoreFoundation)
5   CoreFoundation                  0x00000001855fc414 _CFPropertyListWrite :96 (in CoreFoundation)
6   CoreFoundation                  0x00000001855fbc14 _CFPropertyListCreateData :316 (in CoreFoundation)
7   CoreFoundation                  0x0000000185778f28 _CFPrefsEncodeKeyValuePairIntoMessage :504 (in CoreFoundation)
8   CoreFoundation                  0x0000000185689f94 -[CFPrefsPlistSource sendMessageSettingValue:forKey:] :136 (in CoreFoundation)
9   CoreFoundation                  0x00000001856886ec -[CFPrefsPlistSource alreadylocked_setValues:forKeys:count:from:] :440 (in CoreFoundation)
10  CoreFoundation                  0x0000000185756034 -[CFPrefsSource setValues:forKeys:count:removeValuesForKeys:count:from:] :220 (in CoreFoundation)
11  CoreFoundation                  0x00000001856b9150 -[CFPrefsSearchListSource alreadylocked_setValues:forKeys:count:from:] :584 (in CoreFoundation)
12  CoreFoundation                  0x0000000185756034 -[CFPrefsSource setValues:forKeys:count:removeValuesForKeys:count:from:] :220 (in CoreFoundation)
13  CoreFoundation                  0x00000001857563f4 -[CFPrefsSource setValue:forKey:from:] :64 (in CoreFoundation)
14  CoreFoundation                  0x00000001856bbfa4 __108-[_CFXPreferences(SearchListAdditions) withSearchListForIdentifier:container:cloudConfigurationURL:perform:]_block_invoke :260 (in CoreFoundation)
15  CoreFoundation                  0x00000001856bb7c8 _normalizeQuintuplet :356 (in CoreFoundation)
16  CoreFoundation                  0x00000001856bbe94 -[_CFXPreferences(SearchListAdditions) withSearchListForIdentifier:container:cloudConfigurationURL:perform:] :108 (in CoreFoundation)
17  CoreFoundation                  0x000000018576008c -[_CFXPreferences setValue:forKey:appIdentifier:container:configurationURL:] :92 (in CoreFoundation)
18  CoreFoundation                  0x000000018576370c _CFPreferencesSetAppValueWithContainer :128 (in CoreFoundation)
19  Foundation                      0x000000018601bf80 -[NSUserDefaults(NSUserDefaults) setObject:forKey:] :68 (in Foundation)

You convert your object to data & try to save, You cant save mutable object directly to NSUserDefaults 您将对象转换为数据并尝试保存,无法将可变对象直接保存到NSUserDefaults

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.recordUploadCnt];

[[NSUserDefaults standardUserDefaults] setObject:data forKey: KEY_SENSOR_UPLOAD];

[[NSUserDefaults standardUserDefaults] synchronize];

With reference to Apple document: UserDefaults - Storing Default Objects 参考Apple文档: UserDefaults-存储默认对象

A default object must be a property list—that is, an instance of (or for collections, a combination of instances of) NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. 默认对象必须是属性列表,即NSData,NSString,NSNumber,NSNumber,NSDate,NSArray或NSDictionary的实例(或对于集合而言,是实例的组合)。 If you want to store any other type of object, you should typically archive it to create an instance of NSData. 如果要存储任何其他类型的对象,通常应将其归档以创建NSData实例。

You mayneed to convert it into NSData (try this and see) 您可能需要将其转换为NSData(尝试一下,看看)

NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject: self.recordUploadCnt];
[[NSUserDefaults standardUserDefaults] setObject:arrayData forKey: KEY_SENSOR_UPLOAD];

Check you array values, exact before your add it into NSUserDefaults . 在将数组值添加到NSUserDefaults之前检查数组值。

I tried following and it works for me: 我尝试了以下方法,它对我有用:

#import "ViewController.h"

@interface ViewController () {

}

@property(nonatomic, strong) NSMutableArray* recordUploadCnt;
@end

NSString* const KEY_SENSOR_UPLOAD = @"recordUploadCnt";

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testArrayWithUserDefaults];
}

-(void)testArrayWithUserDefaults {

    double currentTime = [[NSDate date] timeIntervalSince1970];
    [self.recordUploadCnt addObject:[NSString stringWithFormat:@"%f",currentTime]];
    [[NSUserDefaults standardUserDefaults] setObject:self.recordUploadCnt forKey:KEY_SENSOR_UPLOAD];
    [[NSUserDefaults standardUserDefaults] synchronize];

    NSMutableArray* userDefaultsArray = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:KEY_SENSOR_UPLOAD];
    NSLog(@"Array = %@", [NSString stringWithFormat:@"%f",currentTime]);
}

Result: Array = 1512136898.293169 结果:数组= 1512136898.293169

Here is snapshot of working copy: 这是工作副本的快照:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM