最近项目需要缓存,因为项目都是用的对象,要缓存对象必须实现NSCoding协议,但是每个Model都要实现 - (void)encodeWithCoder:(NSCoder*)aCoder - (id...)initWithCoder:(NSCoder*)aDecoder 假如对象有100个属性现实NScoding协议是一件很繁琐的事情,幸好Runtime能很好的解决这个问题。
当类中包含其他类似, 其他类也实现NSCoding就行 #pragma mark - 解档 - (id)initWithCoder:(NSCoder *)decoder {...holderModel = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSUserDefault存Model // Model 实现`NSCoding
你要知道的NSCopying、NSCoding协议及对象序列化和反序列化都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本篇文章主要讲解...NSCopying协议,以及NSCoding协议实现对象的序列化和反序列化,实际开发中如果要自己造轮子这两个协议还是比较重要的。...NSCoding协议与对象序列化和反序列化 在开发中可能需要将自定义对象持久化存储在本地的文件中,或将对象转换为NSData类的数据并通过网络发送,要实现这些操作的前提就是自定义对象需要遵守NSCoding...协议,NSCoding协议是对象序列化和反序列化的基础,NSCoding协议只定义了两个方法: /*将对象编码 序列化对象时调用该方法,在该方法中序列化对象的每一个属性 一般使用encodeObject...关于NSCoding协议的使用是比较简单的,需要注意的就是在initWithCoder:方法中调用父类构造函数的方式。 备注 由于作者水平有限,难免出现纰漏,如有问题还请不吝赐教。
iOS应用数据存储的方式 1、XML属性列表(plist)归档 2、preference(偏好设置) 3、NSKeyedArchiver归档(NSCoding) 4、SQLite3 5、Core...defaults objectForKey:@"name"]; NSLog(@"%@", str); 3、归档-(沙盒存储) 可以存储自定义对象 这里介绍自定义一个person对象 实现这份协议里面的方法让自定义对象里面的属性可以存储 @interface Person : NSObject @property (nonatomic, strong)NSString
要使对象可以归档,对象必须实现NSCoding协议,大部分对象都符合NSCoding的协议,一般我们可以在我们的Model类中实现NSCoding协议。...遵循NSCoding协议,我们需要实现两个方法。
保存 保存的方法目前提供有四个: - (BOOL(^)(id))savePlist; - (BOOL(^)(NSObject *))saveArchivedPlist; - (BOOL...(^)(NSObject *))saveArchivedObject; - (BOOL(^)(id ))save; 示例 在doc路径下保存一个名为”arr.plist
因此,被归档的数据类型都必须遵守一个相同的协议,才能在这个协议的约束下进行正确的归档与解归档,这个协议就是NSCoding协议,我们可以先来看一下NSCoding中的内容: @protocol NSCoding...(3)进行自定义对象的归档 上面介绍中有提到,原则上,任何遵守了NSCoding协议的类都可以进行归档操作,那么对于我们自定义的对象,我们该如何来做呢?...但是也带来了一个缺陷,每个类都需要实现NSCoding中的两个方法是十分繁琐的,并且类越复杂,这个步骤越繁琐,如果在之后的修改和优化中类做了改变,相应的方法也要做改变,这将增加很大的工作量并且埋下潜在bug...所以我们会想,能否设计一个这样的model基类,来使需要存储的model都继承于它,使我们的model不需要实现NSCoding方法的同时可以支持归档呢,通过runtime和OC语言特性的一些小技巧,我们是可以做到的
属性列表(plist)归档 (2)Preference(偏好设置),本质还是通过“plist”来存储数据, 但是使用更简单(无需关注文件、文件夹路径和名称) (3)NSKeyedArchiver归档(NSCoding...; (2)用一个变量接收 switcher.on = [userDefault boolForKey:@"key_name"]; 3、自定义对象归档 NSKeyedArchiver 注意: 必须遵守NSCoding...协议的对象才可以进行归档解档,默NSString、NSDictionary、NSArray、NSData、NSNumber等类型已遵守NSCoding协议,可以直接归档解档。...(1)遵守NSCoding协议,实现协议方法 NSCoding协议中两个方法,一般写在模型中: 归档调用 一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey...path]; (3)解档一个对象 Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 注意: (1)如果父类也遵守了NSCoding
Mantle能做什么 Mantle可以轻松把JSON数据、字典(Dictionary)和模型(即Objective对象)之间的相互转换,支持自定义映射,并且内置实现了NSCoding和NSCoping,..._retrievedAt = [NSDate date]; return self; } @end 很明显,我们不需要再去实现,...MTLModel可以用归档很好的存储模型而不需要去实现令人厌烦的NSCoding协议。...持久化 Mantle配合归档 MTLModel默认实现了 NSCoding协议,可以利用NSKeyedArchiver方便的对对象进行归档和解档。...Mantle配合MagicRecord(一个Core Data框架) Mantle为我们带来的好处 实现了NSCopying protocol,子类可以直接copy是多么爽的事情 实现了NSCoding
3.协议方法列表 static const char *_OBJC_PROTOCOL_METHOD_TYPES_NSCoding [] __attribute__ ((used, section ("...(struct objc_selector *)"initWithCoder:", "@24@0:8@16", 0}} }; struct _protocol_t _OBJC_PROTOCOL_NSCoding...__attribute__ ((used)) = { 0, "NSCoding", 0, (const struct method_list_t *)&_OBJC_PROTOCOL_INSTANCE_METHODS_NSCoding...}; struct _protocol_t *_OBJC_LABEL_PROTOCOL_$_NSCoding = &_OBJC_PROTOCOL_NSCoding; static struct...- YLCustom遵守两个协议 ### 4.最后我们可以看到属性列表 static struct /*_prop_list_t*/ { unsigned
如果你用来存放数据的类是自己定义的,并不是上面这些预置的对象,那么就要借助正式协议NSCoding来实现序列化和反序列化。...比如,我们有一个自己的类Sample.h #import @interface Sample : NSObject { NSString...magicNumber,shoeSize,subThingies]; return (description); } @end 注意其中的:encodeWithCoder与initWithCoder,这是NSCoding
将PaymentModel类型变成NSData类型就必须实现归档,在PaymentModel.h文件中遵守NSCoding协议,在PaymentModel.m文件中实现encodeWithCoder和initWithCoder...如下所示: PaymentModel.h @interface PaymentModel : NSObject //标题 @property (nonatomic, copy)NSString
归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。...由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。 1....遵循NSCoding协议 NSCoding协议声明了两个方法,这两个方法都是必须实现的。一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。...遵循协议和设置属性 1 //1.遵循NSCoding协议 2 @interface Person : NSObject //2.设置属性 3 @property (strong, nonatomic...注意 必须遵循并实现NSCoding协议 保存文件的扩展名可以任意指定 继承时必须先调用父类的归档解档方法 扩展:iOS开发基础-数据存储方式(归档) 2.4 手动存放沙盒 手动将数据存放到沙盒
如:NSCoding协议提供了“序列化机制”(serialization mechanism), 对象可依次指明其自身的 编码encode 及 解码decode 方式。...下面上代码: @interface Rectangle : NSObject // 属性声明为只读,外界就无法设置Rectangle对象的属性了,只能通过初始化方法设置 @property...decodeFloatForKey:@"width"]; _height = [coder decodeFloatForKey:@"height"]; } // 这样写出来的类就完全遵守了NSCoding...协议(fully NSCoding compliant) return self; } @end @interface Square : Rectangle @property (nonatomic
如果是NSString、NSNumber、NSData等基础类型可以直接存储在NSUserDefault,如果是自定义对象则需要实现NSCoding进行对象的序列化和反序列化。...有的开发者会使用系统提供的NSCoding协议手动添加字段,有的开发者会使用Runtime自动实现NSCoding,有的开发者会使用成熟的第三方库(例如YYModel),下面分别介绍这几种序列化的方式。...NSCoding是系统提供的序列化协议,在对象转换为二进制的时候,会通过NSCoding的方法回调开发者。...@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; - (nullable instancetype)initWithCoder:...在将对象转换成二进制数据,以及将二进制数据转换成对象时,可以使用系统提供的NSCoding协议,也可以使用第三方库YYModel。 所有代码GitHub可见,地址。
但是并不是所有类型的对象都能够直接放入 NSUserDefaults,NSUserDefaults 只支持 Foundation 类型的对象,如果自定义 NSObject 对象存入 NSUserDefaults 就要实现 NSCoding...协议了,比如: @interface Person : NSObject @property (nonatomic, copy) NSString *age; @property
2、作用 1.动态交换两个方法的实现 2.为类别添加属性(我们知道类别是不能扩展属性的,只能扩展方法,但可以运行时实现,通过为类增加属性) 3.获取某个类的所有成员变量和成员方法 4.实现NSCoding...class_copyPropertyList返回的仅仅是对象类的属性(@property申明的属性),而class_copyIvarList返回类的所有属性和变量(包括在@interface大括号中声明的变量) 四、实现NSCoding...if (self = [super init]) { [self decode:aDecoder]; } return self; } 当然还可以更加简洁,把NSCoding
因为上文提到过,protocol不能定义成员变量,但是能够声明属性,因为属性=成员变量+setting方法+getting方法 @protocol NSCoding - (void...are safe to be encoded and decoded across privilege boundaries should adopt NSSecureCoding instead of NSCoding...@protocol NSSecureCoding @required // This property must return YES on all classes that allow...class, readonly) BOOL supportsSecureCoding; #else + (BOOL)supportsSecureCoding; #endif @end 苹果在iOS6引入的基于NSCoding...大部分支持NSCoding的系统对象都已经升级到支持NSSecureCoding; 常用于对象编解码; 致谢 感谢雨雪传奇的作品 感谢黄龙辉的作品
在本地存储时,我们可以使用YYModel将对象转成json对应的NSData,也可以使用NSKeyedArchiver结合实现NSCoding协议把对象转成NSData,进而将二进制数据存储在沙盒中或者数据库...因为项目中序列化数据到沙盒是一个高频场景,尝试过数据库、NSCoding+NSKeyedArchiver、YYModel等方法都有各自瓶颈:数据内容比较大数据库会造成体积膨胀过快不便管理,NSCoding
想要归解档,你的模型首先要遵循协议。然后在需要归档或解档的地方直接调用对应方法即可。...示例代码: ///类A @interface A : NSObject @property (nonatomic ,strong) NSString * name; @property...NSLog(@"fail"); } 另外,在实现两个协议方法时,你也可以通过runtime获取属性列表来自动完成转换,但是你要注意的是,想使用runtime自动转的话,你的所有属性最好都是遵循的。
领取专属 10元无门槛券
手把手带您无忧上云