Ios NSUserdefaults不使用NSKeyedArchiver

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

我有一个NSMutableArray,里面装满了我想保存的电影类的对象,但它不起作用,我不知道为什么

电影h:

@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;
}
此外,您似乎正在遵循一个非常过时的教程

  • 您不需要为您的属性声明IVAR
  • 您不需要调用
    @synthesis
  • 您应该使用ARC而不是MRC,因此您的
    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];