2015-06-10 110 views
0

我有一个NSMutableArray里充满了我要救我的电影类至极的对象,但它不工作,我想不通为什么工作...不NSUserDefaults的使用的NSKeyedArchiver

Movie.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 

Movie.m:

@implementation Movie 

@synthesize name; 
@synthesize year; 
@synthesize length; 
@synthesize file_size; 
@synthesize rating; 
@synthesize genre; 
@synthesize plot; 

-(id)initWithName:(NSString *)newName year:(int)newYear length:(int)newLength filesize:(NSString *)newFileSize rating:(int)newRating genre:(NSArray *)newGenre plot:(NSString *)newPlot{ 
    self.name = newName; 
    self.year = newYear; 
    self.length = newLength; 
    self.file_size = newFileSize; 
    self.rating = newRating; 
    self.genre = newGenre; 
    self.plot = newPlot; 
    return self; 
} 
- (void)encodeWithCoder:(NSCoder *)encode; 
{ 
    [encode encodeObject:name forKey:@"name"]; 
    [encode encodeInt32:year forKey:@"year"]; 
    [encode encodeInt32:length forKey:@"length"]; 
    [encode encodeObject:file_size forKey:@"file_size"]; 
    [encode encodeInt32:rating forKey:@"rating"]; 
    [encode encodeObject:genre forKey:@"genre"]; 
    [encode encodeObject:plot forKey:@"plot"]; 
} 

- (id)initWithCoder:(NSCoder *)decode; 
{ 
     NSString *name_decode = [decode decodeObjectForKey:@"name"]; 
     int year_decode = [decode decodeInt32ForKey:@"year"]; 
     int length_decode = [decode decodeInt32ForKey:@"length"]; 
    NSString *file_size_decode = [decode decodeObjectForKey:@"file_size"]; 
    int rating_decode = [decode decodeInt32ForKey:@"rating"]; 
    NSArray *genre_decode = [decode decodeObjectForKey:@"genre"]; 
    NSString *plot_decode =[decode decodeObjectForKey:@"plot"]; 
    return [self initWithName:name_decode year:year_decode length:length_decode filesize:file_size_decode rating:rating_decode genre:genre_decode plot:plot_decode]; 
} 

@end 

保存操作(电影是包含我的对象的NSMutableArray的):

NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults]; 
    NSData *encodedData = [NSKeyedArchiver archivedDataWithRootObject:Movies]; 
    [userDefault setObject:encodedData forKey:[NSString stringWithFormat:@"MOVIES"]]; 

荷载作用:

NSData *decodedData = [userDefault objectForKey: [NSString stringWithFormat:@"MOVIES"]]; 
    NSArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: decodedData]; 

返回的数组始终是(空)......我不知道 我尝试了几种不同类型的代码片段,我发现在互联网上和/或计算器

回答

0

您的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; 
} 

此外,你似乎在遵循一个非常过时的教程。

  1. 您不需要为您的属性声明ivars。
  2. 您不需要拨打电话@synthesize
  3. 您应该使用ARC代替MRC,因此您retain性能应strong(认为NSString性能应copy
  4. init方法应该返回instancetype,不id

与所有的记住,你的Movie类应该如下:

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 

Movie.m

@implementation Movie 

- (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) { 
     _name = newName; 
     _year = newYear; 
     _length = newLength; 
     _file_size = newFileSize; 
     _rating = newRating; 
     _genre = newGenre; 
     _plot = newPlot; 
    } 

    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encode; 
{ 
    [encode encodeObject:self.name forKey:@"name"]; 
    [encode encodeInt32:self.year forKey:@"year"]; 
    [encode encodeInt32:self.length forKey:@"length"]; 
    [encode encodeObject:self.file_size forKey:@"file_size"]; 
    [encode encodeInt32:self.rating forKey:@"rating"]; 
    [encode encodeObject:self.genre forKey:@"genre"]; 
    [encode encodeObject:self.plot forKey:@"plot"]; 
} 

- (instancetype)initWithCoder:(NSCoder *)decode; 
{ 
    NSString *name_decode = [decode decodeObjectForKey:@"name"]; 
    int year_decode = [decode decodeInt32ForKey:@"year"]; 
    int length_decode = [decode decodeInt32ForKey:@"length"]; 
    NSString *file_size_decode = [decode decodeObjectForKey:@"file_size"]; 
    int rating_decode = [decode decodeInt32ForKey:@"rating"]; 
    NSArray *genre_decode = [decode decodeObjectForKey:@"genre"]; 
    NSString *plot_decode =[decode decodeObjectForKey:@"plot"]; 
    return [self initWithName:name_decode year:year_decode length:length_decode filesize:file_size_decode rating:rating_decode genre:genre_decode plot:plot_decode]; 
} 

@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]; 
+0

谢谢@rmaddy!那是为我做的! :)) BTW,电影不是问题,它一定是解码/编码选择器 – MothaFvckaJones

0

快速测试是查看可变数组本身是否为零。在设置userDefaults之前,尝试输出可变阵列。

确保在尝试向其中添加对象之前对可变数组进行初始化。

movies = [[NSMutableArray alloc] init];