问题
I want to write an array of Question objects to file, but somehow writeToFile isn't doing anything. A Question has an Owner and and an array of Answer objects. An Answer has an Owner as well. All three of them conform to the NSCoding protocol (as far as I know).
From the code below, result returns NO. No clue what I'm doing wrong, since I am implementing NSCoding for everything, right?
Question.h
#import <Foundation/Foundation.h>
#import "Owner.h"
@interface Question : NSObject <NSCoding> {
NSString *questionId;
NSString *questionRevision;
NSString *text;
NSDate *date;
NSMutableArray *answers;
NSString *page;
NSNumber *questionLocation;
Owner *owner;
}
@property (nonatomic, retain) NSString *questionId;
@property (nonatomic, retain) NSString *questionRevision;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSMutableArray *answers;
@property (nonatomic, retain) NSString *page;
@property (nonatomic, retain) NSNumber *questionLocation;
@property (nonatomic, retain) Owner *owner;
@end
Question.m
#import "Question.h"
#import "Answer.h"
@implementation Question
@synthesize questionId, questionRevision, text, date, answers, page, questionLocation, owner;
- (void)encodeWithCoder:(NSCoder *)coder
{
//[super encodeWithCoder:coder];
[coder encodeObject:questionId forKey:@"questionId"];
[coder encodeObject:questionRevision forKey:@"questionRevision"];
[coder encodeObject:text forKey:@"text"];
[coder encodeObject:date forKey:@"date"];
[coder encodeObject:answers forKey:@"answers"];
[coder encodeObject:page forKey:@"page"];
[coder encodeObject:questionLocation forKey:@"questionLocation"];
[coder encodeObject:owner forKey:@"owner"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
//self = [super initWithCoder:decoder];
self = [super init];
self.questionId = [decoder decodeObjectForKey:@"questionId"];
self.questionRevision = [decoder decodeObjectForKey:@"questionRevision"];
self.text = [decoder decodeObjectForKey:@"text"];
self.date = [decoder decodeObjectForKey:@"date"];
self.answers = [decoder decodeObjectForKey:@"answers"];
self.page = [decoder decodeObjectForKey:@"page"];
self.questionLocation = [decoder decodeObjectForKey:@"questionLocation"];
self.owner = [decoder decodeObjectForKey:@"owner"];
}
@end
Answer.h
#import <Foundation/Foundation.h>
#import "Owner.h"
@interface Answer : NSObject <NSCoding> {
Owner *owner;
NSString *text;
NSDate *date;
}
@property (nonatomic, retain) Owner *owner;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@end
Answer.m
#import "Answer.h"
@implementation Answer
@synthesize owner, text, date;
- (void)encodeWithCoder:(NSCoder *)coder
{
//[super encodeWithCoder:coder];
[coder encodeObject:owner forKey:@"owner"];
[coder encodeObject:text forKey:@"text"];
[coder encodeObject:date forKey:@"date"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
//self = [super initWithCoder:decoder];
self = [super init];
self.owner = [decoder decodeObjectForKey:@"owner"];
self.text = [decoder decodeObjectForKey:@"text"];
self.date = [decoder decodeObjectForKey:@"date"];
}
@end
Owner.h
#import <Foundation/Foundation.h>
@interface Owner : NSObject <NSCoding> {
NSString *name;
NSString *photoFileName;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *photoFileName;
@end
Owner.m
#import "Owner.h"
@implementation Owner
@synthesize name, photoFileName;
- (void)encodeWithCoder:(NSCoder *)coder
{
//[super encodeWithCoder:coder];
[coder encodeObject:name forKey:@"name"];
[coder encodeObject:photoFileName forKey:@"photoFileName"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
//self = [super initWithCoder:decoder];
self = [super init];
self.name = [decoder decodeObjectForKey:@"name"];
self.photoFileName = [decoder decodeObjectForKey:@"photoFileName"];
}
@end
Relevant line of codeBOOL result = [questions writeToFile:@"Users/brunoscheele/Desktop/questions.plist" atomically:YES];
回答1:
writeToFile:atomically:
writes property list files, not serialised archives. Property list types can't be extended by implementing NSCoding
, and as your objects aren't one of the types supported by property lists, then they can't be written to a property list.
To archive your objects, you'll need to use an NSAchiver
, for example:
[NSKeyedArchiver archiveRootObject:questions
toFile:@"some/path/questions.archive"]
回答2:
Taken from here NSMutableArray writeToFile:atomically always returns NO on device but works fine on simulator
I don't think you can not write into the application's bundle so you can not write to a plist in the Resources directory. One good way is to copy the plist from the Resource directory into the Documents directory on first launch and access it from there in the future..
来源:https://stackoverflow.com/questions/5352032/objects-conforming-to-nscoding-will-not-writetofile