NSUserDefaults 为数组中的某些字符串返回 nil
NSUserDefaults returning nil for some strings in array
我有一个自定义对象 "Woman"。我试图在其中存储以下值并使用 NSUserDefaults 将其保存在可变数组中。我使用的代码如下。我还在对象中使用 NSCoding。
if (women ==nil) {
women =[[NSMutableArray alloc] init];
}
NSString *string =[NSString stringWithFormat:@"%f", interval];
//store to woman object
Woman* woman = [[Woman alloc] initWithFull:nameOfGirl withdate2:perfectdate withintervalLength:string withperiodLength:[NSString stringWithFormat:@"432000"] withpmsLength:[NSString stringWithFormat:@"432000"]];
[women addObject:woman];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:women] forKey:@"women"];
我使用此代码检索它:
//pull women from archive
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults valueForKey:@"women"];
if (dataRepresentingSavedArray != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
if (oldSavedArray != nil)
women = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
women = [[NSMutableArray alloc] init];
}
结果在截图中。对我来说有趣的是,第一个字符串成功了,但其他字符串却没有。 :
编辑:这是我的习惯 class。
.h:
#import <Foundation/Foundation.h>
@interface Woman : NSObject <NSCoding>
@property (nonatomic,strong) NSString *girlname;
@property (nonatomic,strong) NSDate *date2;
@property (nonatomic,strong) NSString *intervalLength;
@property (nonatomic,strong) NSString *periodLength;
@property (nonatomic, strong) NSString *pmsLength;
- (id)initWithFull:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength;
- (id)initWithNoInterval:(NSString *)girlname withdate2:(NSDate *)date2 withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength;
- (id)initWithIntervalnoPMSPeriod:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength;
- (void) encodeWithCoder:(NSCoder*)encode;
- (id) initWithCoder:(NSCoder*)decode;
@end
和.m:
#import "Woman.h"
@implementation Woman
-(id)initWithFull:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength {
self = [super init];
self.girlname = girlname;
self.date2 = date2;
self.intervalLength = intervalLength;
self.pmsLength = pmsLength;
self.periodLength = periodLength;
return self;
}
-(id)initWithIntervalnoPMSPeriod:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength {
self = [super init];
self.girlname = girlname;
self.date2 = date2;
self.intervalLength = intervalLength;
return self;
}
-(id)initWithNoInterval:(NSString *)girlname withdate2:(NSDate *)date2 withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength {
self = [super init];
self.girlname = girlname;
self.date2 = date2;
self.pmsLength = pmsLength;
self.periodLength = periodLength;
return self;
}
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
self.girlname = [coder decodeObjectForKey:@"girlname"];
self.date2 = [coder decodeObjectForKey:@"date2"];
self.intervalLength = [coder decodeObjectForKey:@"intervalLength"];
self.pmsLength = [coder decodeObjectForKey:@"pmsLength"];
self.periodLength = [coder decodeObjectForKey:@"periodLength"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:_girlname forKey:@"girlname"];
[coder encodeObject:_date2 forKey:@"date2"];
[coder encodeBool:_intervalLength forKey:@"intervalLength"];
[coder encodeBool:_pmsLength forKey:@"pmsLength"];
[coder encodeBool:_periodLength forKey:@"periodLength"];
}
@end
这也是一个断点屏幕截图,它显示最新的对象(索引 2)在存储在 NSDefaults 中之前具有值。
更新:切换 "nameofgirl" 和间隔字符串后,间隔字符串有效,但 nameofgirl 返回 nil。因此,出于某种原因,只有前两个值起作用。
intervalLength
、pmsLength
和 periodLength
是 NSString
个对象。使用 encodeObject: 对它们进行编码。
我有一个自定义对象 "Woman"。我试图在其中存储以下值并使用 NSUserDefaults 将其保存在可变数组中。我使用的代码如下。我还在对象中使用 NSCoding。
if (women ==nil) {
women =[[NSMutableArray alloc] init];
}
NSString *string =[NSString stringWithFormat:@"%f", interval];
//store to woman object
Woman* woman = [[Woman alloc] initWithFull:nameOfGirl withdate2:perfectdate withintervalLength:string withperiodLength:[NSString stringWithFormat:@"432000"] withpmsLength:[NSString stringWithFormat:@"432000"]];
[women addObject:woman];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:women] forKey:@"women"];
我使用此代码检索它:
//pull women from archive
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults valueForKey:@"women"];
if (dataRepresentingSavedArray != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
if (oldSavedArray != nil)
women = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
women = [[NSMutableArray alloc] init];
}
结果在截图中。对我来说有趣的是,第一个字符串成功了,但其他字符串却没有。 :
编辑:这是我的习惯 class。
.h:
#import <Foundation/Foundation.h>
@interface Woman : NSObject <NSCoding>
@property (nonatomic,strong) NSString *girlname;
@property (nonatomic,strong) NSDate *date2;
@property (nonatomic,strong) NSString *intervalLength;
@property (nonatomic,strong) NSString *periodLength;
@property (nonatomic, strong) NSString *pmsLength;
- (id)initWithFull:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength;
- (id)initWithNoInterval:(NSString *)girlname withdate2:(NSDate *)date2 withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength;
- (id)initWithIntervalnoPMSPeriod:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength;
- (void) encodeWithCoder:(NSCoder*)encode;
- (id) initWithCoder:(NSCoder*)decode;
@end
和.m:
#import "Woman.h"
@implementation Woman
-(id)initWithFull:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength {
self = [super init];
self.girlname = girlname;
self.date2 = date2;
self.intervalLength = intervalLength;
self.pmsLength = pmsLength;
self.periodLength = periodLength;
return self;
}
-(id)initWithIntervalnoPMSPeriod:(NSString *)girlname withdate2:(NSDate *)date2 withintervalLength:(NSString *)intervalLength {
self = [super init];
self.girlname = girlname;
self.date2 = date2;
self.intervalLength = intervalLength;
return self;
}
-(id)initWithNoInterval:(NSString *)girlname withdate2:(NSDate *)date2 withperiodLength:(NSString *)periodLength withpmsLength:(NSString *)pmsLength {
self = [super init];
self.girlname = girlname;
self.date2 = date2;
self.pmsLength = pmsLength;
self.periodLength = periodLength;
return self;
}
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
self.girlname = [coder decodeObjectForKey:@"girlname"];
self.date2 = [coder decodeObjectForKey:@"date2"];
self.intervalLength = [coder decodeObjectForKey:@"intervalLength"];
self.pmsLength = [coder decodeObjectForKey:@"pmsLength"];
self.periodLength = [coder decodeObjectForKey:@"periodLength"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:_girlname forKey:@"girlname"];
[coder encodeObject:_date2 forKey:@"date2"];
[coder encodeBool:_intervalLength forKey:@"intervalLength"];
[coder encodeBool:_pmsLength forKey:@"pmsLength"];
[coder encodeBool:_periodLength forKey:@"periodLength"];
}
@end
这也是一个断点屏幕截图,它显示最新的对象(索引 2)在存储在 NSDefaults 中之前具有值。
更新:切换 "nameofgirl" 和间隔字符串后,间隔字符串有效,但 nameofgirl 返回 nil。因此,出于某种原因,只有前两个值起作用。
intervalLength
、pmsLength
和 periodLength
是 NSString
个对象。使用 encodeObject: 对它们进行编码。