@interface Test : NSManagedobject<NSCoding>@property (nonatomic,retain) Nsstring * Title;@end@implementation Test@dynamic Title;- (ID)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { self.Title = [coder decodeObjectForKey:@"Title"]; //<CRASH } return self;}- (voID)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.Title forKey:@"Title"];}@endNSData *archivedobjects = [NSKeyedArchiver archivedDataWithRootObject:testObj];NSData *objectsData = archivedobjects;if ([objectsData length] > 0) { NSArray *objects = [NSKeyedUnarchiver unarchiveObjectWithData:objectsData];}
上面代码的问题是.它在initWithCoder中的self.Title崩溃,说无法识别的选择器发送到实例.
>为什么标题不被识别为选择器.
>在initWithCoder中创建对象之前,unarchive应该以某种方式使用nil托管对象上下文吗?
>我需要覆盖copyWithZone吗?
- (ID)initWithCoder:(NSCoder *)aDecoder { NSEntityDescription *entity = [NSEntityDescription entityForname:@"Test" inManagedobjectContext:<YourContext>]; self = [super initWithEntity:entity insertIntoManagedobjectContext:nil]; NSArray * attributenameArray = [[NSArray alloc] initWithArray:self.entity.attributesByname.allKeys]; for (Nsstring * attributename in attributenameArray) { [self setValue:[aDecoder decodeObjectForKey:attributename] forKey:attributename]; } return self;}
上面的代码片段只处理属性,没有关系.使用NSCoding处理NSManagedobjectID之间的关系非常糟糕.如果您确实需要考虑引入一个额外的属性以在解码时匹配两个(或许多)实体.
如何获得< YourContext>
(基于Sam Soffes现在不可用的帖子,代码来自https://gist.github.com/soffes/317794#file-ssmanagedobject-m)
+ (NSManagedobjectContext *)mainContext { AppDelegate *appDelegate = [AppDelegate sharedAppDelegate];return [appDelegate managedobjectContext];}
注意:替换< YourContext>在mainContext的第一个片段中
总结以上是内存溢出为你收集整理的ios – NSManagedObject是否符合NSCoding全部内容,希望文章能够帮你解决ios – NSManagedObject是否符合NSCoding所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)