ios - 序列化包含未实现 NSCoding 的类的 NSMutableArray

标签 ios objective-c cocoa-touch serialization nsarray

我需要将 NSMutableArray 保存到磁盘以存储我的应用程序数据。我知道那里有很多类似的问题,但我发现没有一个能涵盖我的问题。

我不想为了保存一个 NSMutableArray 而集成 Core Data。通常我会去实现 NSCoding 协议(protocol)并使用 NSKeyedUnarchiver。不幸的是,我的数据模型类有一些来自库的外部类,这些类没有实现 NSCoding 协议(protocol)。

那么我存储数组的最佳方式是什么?

这是我尝试过的方法,但由于给定的原因,它不起作用:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <ForeignFramework/ForeignFramework.h>

@interface DEModelClass : NSObject <NSCoding>

@property (nonatomic,strong) ForeignFramework *foreignFramework;
@property (nonatomic,strong) UIImage *image;
@property (nonatomic,copy) NSNumber *number1;
@property (nonatomic,copy) NSNumber *number2;

@end


#define kEncodeKeyForeign   @"kEncodeKeyForeign"
#define kEncodeKeyImage      @"kEncodeKeyImage"
#define kEncodeKeyNumber1     @"kEncodeKeyNumber1"
#define kEncodeKeyNumber2     @"kEncodeKeyNumber2"


#pragma mark - NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.foreignFramework   forKey:kEncodeKey];
    [aCoder encodeObject:self.image  forKey:kEncodeKeyImage];
    [aCoder encodeObject:self.number1 forKey:kEncodeKeyNumber1];
    [aCoder encodeObject:self.number2 forKey:kEncodeKeyNumber2];

}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super init]))
    {
        self.foreignFramework = [aDecoder decodeObjectForKey:kEncodeKeyForeign];
        self.image    = [aDecoder decodeObjectForKey:kEncodeKeyImage];
        self.number1   = [aDecoder decodeObjectForKey:kEncodeKeyNumber1];
        self.number2   = [aDecoder decodeObjectForKey:kEncodeKeyNumber2];

    }
    return self;
}

最佳答案

你应该使用NSCoding协议(protocol),你可以使用它。

一个。我假设您知道要存储外部类的哪些属性。 (可能是让您在加载时重新实例化实例对象的数据。)如果不是,则无法存储它们。当然,Cocoa,NSArray,$whatever 无法知道它。这些是通用的。

B.当您完成选择要存储的属性后,只需将一个类别添加到为您完成这项工作的外部类:

@interface ForeignClass (MyCodingAddition)
- (void)encodeWithCoder:(NSCoder*)encoder;
- (id)initWithCoder:(NSCoder*)decoder;
@end

@implementation ForeignClass (MyCodingAddition)
- (void)encodeWithCoder:(NSCoder*)encoder
{
  [coder encodeObject:self.property withKey:…]
  …
}

- (id)initWithCoder:(NSCoder*)decoder
{
  self = [super init];
  if (self)
  {
    self.property = [decode objectForKey:…];
    …
  }
  return self;
}
@end

关于ios - 序列化包含未实现 NSCoding 的类的 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29514712/

相关文章:

objective-c - self.navigationController == nil 从 LocalNotification 唤醒后

iOS 选择要在表格中显示的特定条目

ios - 由于自动布局和大量 subview ,关闭 VC 非常慢

objective-c - 将 NSPopUpButtonCell 与 NSTableView 一起使用

iphone - 我应该在每个 View 中都有一个 NSFetchedResultsController 吗?

swift - 在循环内使用dispatch_after延迟

ios - UICollectionView 窃取焦点

ios - 压缩包含带有加载图像的 UIImageView 的 NSKeyedArchiver 文件

ios - 在Objective-C中长期运行的任务

ios - UILabel 属性文本未更改