Ios NSUserdefaults不使用NSKeyedArchiver
我有一个NSMutableArray,里面装满了我想保存的电影类的对象,但它不起作用,我不知道为什么 电影h:Ios NSUserdefaults不使用NSKeyedArchiver,ios,objective-c,nsuserdefaults,nscoding,nskeyedarchiver,Ios,Objective C,Nsuserdefaults,Nscoding,Nskeyedarchiver,我有一个NSMutableArray,里面装满了我想保存的电影类的对象,但它不起作用,我不知道为什么 电影h: @interface Movie : NSObject <NSCoding>{ NSString *name; int year; int length; NSString *file_size; int rating; NSArray *genre; NSString *plot; } @property (non
@interface Movie : NSObject <NSCoding>{
NSString *name;
int year;
int length;
NSString *file_size;
int rating;
NSArray *genre;
NSString *plot;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) int year;
@property (nonatomic, assign) int length;
@property (nonatomic, retain, retain) NSString *file_size;
@property (nonatomic, assign) int rating;
@property (nonatomic, retain) NSArray *genre;
@property (nonatomic, retain) NSString *plot;
-(id) initWithName:(NSString*)newName year:(int)newYear length:(int)newLength filesize:(NSString*)newFileSize rating:(int)newRating genre:(NSArray*)newGenre plot:(NSString*)newPlot;
- (void) encodeWithCoder : (NSCoder *)encode ;
- (id) initWithCoder : (NSCoder *)decode;
@end
保存操作(Movies是包含我的对象的NSMutableArray):
荷载作用:
NSData *decodedData = [userDefault objectForKey: [NSString stringWithFormat:@"MOVIES"]];
NSArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: decodedData];
返回的数组始终为(null)。。。我不知道
我尝试了在internet和/或stackoverflow上找到的几种不同类型的代码片段。一个快速测试是查看可变数组本身是否不是nil。在
userDefaults
中设置可变数组之前,请尝试输出该数组
在尝试向可变数组添加对象之前,请确保该数组已初始化
movies = [[NSMutableArray alloc] init];
您的
Movie initWithName…
方法不正确。它需要:
- (instancetype)initWithName:(NSString *)newName year:(int)newYear length:(int)newLength filesize:(NSString *)newFileSize rating:(int)newRating genre:(NSArray *)newGenre plot:(NSString *)newPlot {
self = [super init];
if (self) {
self.name = newName;
self.year = newYear;
self.length = newLength;
self.file_size = newFileSize;
self.rating = newRating;
self.genre = newGenre;
self.plot = newPlot;
}
return self;
}
此外,您似乎正在遵循一个非常过时的教程
@synthesis
retain
属性应该是strong
(虽然NSString
属性应该是copy
)init
方法应该返回instancetype
,而不是id
电影
课程应该如下:
Movie.h
@interface Movie : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int year;
@property (nonatomic, assign) int length;
@property (nonatomic, copy) NSString *file_size;
@property (nonatomic, assign) int rating;
@property (nonatomic, strong) NSArray *genre;
@property (nonatomic, copy) NSString *plot;
- (instancetype)initWithName:(NSString *)newName year:(int)newYear length:(int)newLength filesize:(NSString *)newFileSize rating:(int)newRating genre:(NSArray *)newGenre plot:(NSString *)newPlot;
@end
您不会显示如何创建和填充Movies
变量(该变量应命名为Movies
,而不是Movies
。请确保它不是nil
另外,不要不必要地使用stringWithFormat
您的保存代码应为:
NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
NSData *encodedData = [NSKeyedArchiver archivedDataWithRootObject:movies];
[userDefault setObject:encodedData forKey:@"MOVIES"];
NSData *decodedData = [userDefault objectForKey:@"MOVIES"];
NSArray *decodedArray = [NSKeyedUnarchiver unarchiveObjectWithData: decodedData];
您的加载代码应为:
NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
NSData *encodedData = [NSKeyedArchiver archivedDataWithRootObject:movies];
[userDefault setObject:encodedData forKey:@"MOVIES"];
NSData *decodedData = [userDefault objectForKey:@"MOVIES"];
NSArray *decodedArray = [NSKeyedUnarchiver unarchiveObjectWithData: decodedData];
谢谢@rmaddy!这帮我做到了!:)顺便说一句,电影不是问题,一定是解码/编码选择器
NSData *decodedData = [userDefault objectForKey:@"MOVIES"];
NSArray *decodedArray = [NSKeyedUnarchiver unarchiveObjectWithData: decodedData];