2015-06-10 3 views
0

У меня есть NSMutableArray заполнены с объектами моего класса Movie Wich я хочу сохранить, но он не работает, и я не могу понять, почему ...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]; 

Возвращаемый массив всегда (нуль) ... я не имею ключ я попробовал несколько другого рода фрагменты кода я не нашел в Интернете и/или StackOverflow

ответ

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]; 

 Смежные вопросы

  • Нет связанных вопросов^_^