<NSCoding> 当类中包含其他类似, 其他类也实现NSCoding就行 #pragma mark - 解档 - (id)initWithCoder:(NSCoder *)decoder { forKey:strName]; } free(ivar); } return self; } #pragma mark - 归档 - (void)encodeWithCoder:(NSCoder valueForKey:strName]; // 进行归档赋值 [encoder encodeObject:value forKey:strName]; } free(ivar); } NSCoder
(nonatomic, copy) NSString *age; @property (nonatomic, copy) NSString *name; - (id)initWithCoder:(NSCoder *)coder; - (void)encodeWithCoder:(NSCoder *)coder; @implementation Person - (id)initWithCoder:(NSCoder self.name = [coder decodeObjectForKey:@"name"]; } return self; } - (void)encodeWithCoder: (NSCoder
最近项目需要缓存,因为项目都是用的对象,要缓存对象必须实现NSCoding协议,但是每个Model都要实现 - (void)encodeWithCoder:(NSCoder*)aCoder - (id )initWithCoder:(NSCoder*)aDecoder 假如对象有100个属性现实NScoding协议是一件很繁琐的事情,幸好Runtime能很好的解决这个问题。 实现的思路写一个BaseModel,在BaseModel里实现 - (void)encodeWithCoder:(NSCoder*)aCoder - (id)initWithCoder:(NSCoder
age forKey:kage]; [aCoder encodeObject:_others forKey:kothers]; } - (instancetype)initWithCoder:(NSCoder implementation NSObject (ArchiveExtension) // 先对当前类进行编码,然后对父类进行编码,如果父类是NSObject就结束编码 - (void)encode:(NSCoder :key]; } free(ivars); c = [c superclass]; } } - (void)decode:(NSCoder ivars); c = [c superclass]; } } @end 这时,可以在DWPerson.m中取代之前的代码 - (void)encodeWithCoder:(NSCoder *)aCoder { [self encode:aCoder]; } - (instancetype)initWithCoder:(NSCoder *)aDecoder { if (
NSObject<NSCoding> @property (nonatomic, strong)NSString *name; // 协议里面的方法: - (void)encodeWithCoder:(NSCoder *)aCoder; // 归档 - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // 解档 // 存储name属性 - (void )encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_name forKey:@"name"]; } // 读取name属性并赋值 - (instancetype)initWithCoder:(NSCoder *)aDecoder { if (self = [super init]) {
实际代码也很简单,只需在自定义类中重写方法: (void)encodeWithCoder:(NSCoder*)aCoder { [self yy_modelEncodeWithCoder:aCoder ]; } (id)initWithCoder:(NSCoder*)aDecoder { self = [super init]; return [self yy_modelInitWithCoder:
"Person.h" @interface Person ()<NSCoding> @end @implementation Person - (void)encodeWithCoder:(NSCoder forKey:@"name"]; [aCoder encodeObject:_age forKey:@"age"]; } - (instancetype)initWithCoder:(NSCoder /runtime.h> @interface Person()<NSCoding> @end @implementation Person - (void)encodeWithCoder:(NSCoder encodeObject:[self valueForKey:key] forKey:key]; } } - (nullable instancetype)initWithCoder:(NSCoder
n.timeIntervalSince1970);return YES;} 3 Coding/Copying/hash/equal/description - (void)encodeWithCoder:(NSCoder *)aCoder { [self yy_modelEncodeWithCoder:aCoder]; } - (id)initWithCoder:(NSCoder *)aDecoder { self = YYModelCommon - (NSString *)description {\ return [self modelDescription];\}\- (void)encodeWithCoder:(NSCoder *)aCoder {\ [self modelEncodeWithCoder:aCoder];\}\- (id)initWithCoder:(NSCoder *)aDecoder {\ self =
才能在这个协议的约束下进行正确的归档与解归档,这个协议就是NSCoding协议,我们可以先来看一下NSCoding中的内容: @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder; @end 这个协议非常简单,一个init的归档方法,一个encode的解归档方法,NSCoder 可以看出,正是我们前边说过的,必须遵守归档协议的对象,才可以被归档,我们在MyObject类中实现如下两个方法: //解档方法 - (instancetype)initWithCoder:(NSCoder 2、基类模型的设计 我们新建一个BaseModel类,核心方法如下: //归档与解归档的方法 - (instancetype)initWithCoder:(NSCoder *)coder stringWithFormat:@"c%@",key]] forKey:key]; } } return self; } - (void)encodeWithCoder:(NSCoder
instancetype)initWithFrame:(CGRect)frame; //使用xib创建或者用拖控件的方式创建自定义View对象,会调用到重写的- (instancetype)initWithCoder:(NSCoder *)aDecoder; - (instancetype)initWithCoder:(NSCoder *)aDecoder; 举例: - (instancetype)init{ NSLog(@ { NSLog(@"initWithFrame ... 222"); } return self; } - (instancetype)initWithCoder:(NSCoder
NSArray *)ignoredNames { return @[@"_aaa",@"_bbb",@"_ccc"]; } // 归档调用方法 - (void)encodeWithCoder:(NSCoder encodeObject:@(self.age) forKey:@"_age"]; } free(ivars); } // 解档方法 - (instancetype)initWithCoder:(NSCoder *)aCoder; - (void)decode:(NSCoder *)aDecoder; @end NSObject+Extension.m #import "NSObject+Extension.h " #import <objc/runtime.h> @implementation NSObject (Extension) - (void)decode:(NSCoder *)aDecoder setValue:value forKey:key]; } free(ivars); c = [c superclass]; } } - (void)encode:(NSCoder
- (void)encodeWithCoder:(NSCoder *)aCoder; - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder 该协议允许复制对象,遵循该协议要实现- (id)copyWithZone:(nullable NSZone *)zone;方法 下面我们来看归档协议方法的实现 -(void)encodeWithCoder:(NSCoder aCoder encodeObject:_version forKey:@"version"]; } 接下来是解档的协议方法实现 - (nullable instancetype)initWithCoder:(NSCoder
end PaymentModel.m #import "PaymentModel.h" @implementation PaymentModel - (void)encodeWithCoder:(NSCoder forKey:@"title"]; [aCoder encodeObject:self.picture forKey:@"picture"]; } - (id)initWithCoder:(NSCoder
1.在自定义类中写一个宏MJCodingImplementation,此宏是实现了- (id)initWithCoder:(NSCoder )decoder方法和- (void)encodeWithCoder :(NSCoder )encoder方法。
让这个自定义类实现<NSCoding>协议中的 - (id) initWithCoder: (NSCoder *)coder方法和 - (void) encodeWithCoder: (NSCoder copy,nonatomic)NSString *ageStr; @end #import "Test.h" @implementation Test - (id) initWithCoder: (NSCoder self.ageStr = [coder decodeObjectForKey:@"ageStr"]; } return self; } - (void) encodeWithCoder: (NSCoder
如下面的例子: 在Shop.m中 #import "Shop.h" @implementation Shop #pragma mark 编码 -(void)encodeWithCoder:(NSCoder [enCoder encodeDouble:self.price forKey:@"price"]; } #pragma mark 解码 - (instancetype)initWithCoder:(NSCoder
于是开心地双击, 然后呢, Xcode 在我们的屏幕中自动生成了这些东西: Swift 复制代码 required init(coder aDecoder: NSCoder) { fatalError 而 init(coder aDecoder: NSCoder) 方法是来自父类的指定构造器, 因为这个构造器是 required, 必须要实现. ) { super.init(style: .Default, reuseIdentifier: nil) } required init(coder aDecoder: NSCoder ) { super.init(style: .Default, reuseIdentifier: nil) } required init(coder aDecoder: NSCoder () { self.init(style: .Default, reuseIdentifier: nil) } required init(coder aDecoder: NSCoder
decodeObjectForKey:@"_age"]; } free(ivars); } return self; } // 归档调用方法 - (void)encodeWithCoder:(NSCoder *)aCoder; - (void)decode:(NSCoder *)aDecoder; @end NSObject+Extension.m #import "NSObject+Extension.h " #import <objc/runtime.h> @implementation NSObject (Extension) - (void)decode:(NSCoder *)aDecoder ]; [self setValue:value forKey:key]; } free(ivars); c = [c superclass]; } } - (void)encode:(NSCoder - (NSArray *)ignoredNames { return @[@"bone"]; } // 在系统方法内来调用我们的方法 - (instancetype)initWithCoder:(NSCoder
(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } (coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } //MARK (coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } (coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } (coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
kotlinx.cinterop.ExportObjCClass import kotlinx.cinterop.ObjCAction import kotlinx.cinterop.ObjCOutlet import platform.Foundation.NSCoder kotlinx.cinterop.initBy @ExportObjCClass class ViewController: UIViewController { constructor(aDecode:NSCoder ): super(aDecode) override fun initWithCoder(aDecode:NSCoder) =initBy(ViewController(aDecode))