首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏日常技术分享

    利用Runtime实现NScoding

    最近项目需要缓存,因为项目都是用的对象,要缓存对象必须实现NSCoding协议,但是每个Model都要实现 - (void)encodeWithCoder:(NSCoder*)aCoder - (id )initWithCoder:(NSCoder*)aDecoder 假如对象有100个属性现实NScoding协议是一件很繁琐的事情,幸好Runtime能很好的解决这个问题。

    36510发布于 2018-09-13
  • 来自专栏iOS开发~

    iOS_runtime实现NSCoding NSCoder缓存对象 NSCoping

    <NSCoding>  当类中包含其他类似, 其他类也实现NSCoding就行 #pragma mark - 解档 - (id)initWithCoder:(NSCoder *)decoder { holderModel = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSUserDefault存Model // Model 实现`NSCoding

    54320编辑于 2022-07-20
  • 来自专栏iOS技术杂谈

    NSCopying和NSCoding对象序列化反序列化基础详解你要知道的NSCopying、NSCoding协议及对象序列化和反序列化都在这里

    你要知道的NSCopying、NSCoding协议及对象序列化和反序列化都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本篇文章主要讲解 NSCopying协议,以及NSCoding协议实现对象的序列化和反序列化,实际开发中如果要自己造轮子这两个协议还是比较重要的。 NSCoding协议与对象序列化和反序列化 在开发中可能需要将自定义对象持久化存储在本地的文件中,或将对象转换为NSData类的数据并通过网络发送,要实现这些操作的前提就是自定义对象需要遵守NSCoding 协议,NSCoding协议是对象序列化和反序列化的基础,NSCoding协议只定义了两个方法: /*将对象编码 序列化对象时调用该方法,在该方法中序列化对象的每一个属性 一般使用encodeObject 关于NSCoding协议的使用是比较简单的,需要注意的就是在initWithCoder:方法中调用父类构造函数的方式。 备注 由于作者水平有限,难免出现纰漏,如有问题还请不吝赐教。

    1.7K90发布于 2018-04-10
  • 来自专栏宜达数字

    iOS开发--常用的数据存储方式

    iOS应用数据存储的方式 1、XML属性列表(plist)归档 2、preference(偏好设置) 3、NSKeyedArchiver归档(NSCoding) 4、SQLite3 5、Core defaults objectForKey:@"name"]; NSLog(@"%@", str); 3、归档-(沙盒存储) 可以存储自定义对象 这里介绍自定义一个person对象<遵守NSCoding 协议> 实现这份协议里面的方法让自定义对象里面的属性可以存储 @interface Person : NSObject<NSCoding> @property (nonatomic, strong)NSString

    1.1K20发布于 2020-06-02
  • 来自专栏编程之旅

    iOS开发——数据持久化之归档

    要使对象可以归档,对象必须实现NSCoding协议,大部分对象都符合NSCoding的协议,一般我们可以在我们的Model类中实现NSCoding协议。 遵循NSCoding协议,我们需要实现两个方法。

    82010发布于 2018-08-30
  • 来自专栏零域Blog

    ObjC 使用链式语法更优雅地管理沙盒文件

    保存 保存的方法目前提供有四个: - (BOOL(^)(id))savePlist; - (BOOL(^)(NSObject<NSCoding> *))saveArchivedPlist; - (BOOL (^)(NSObject<NSCoding> *))saveArchivedObject; - (BOOL(^)(id <NSCoding>))save; 示例 在doc路径下保存一个名为”arr.plist

    33930编辑于 2022-03-22
  • 来自专栏一“技”之长

    iOS数据持久化之二——归档与设计可存储化的数据模型基类

    因此,被归档的数据类型都必须遵守一个相同的协议,才能在这个协议的约束下进行正确的归档与解归档,这个协议就是NSCoding协议,我们可以先来看一下NSCoding中的内容: @protocol NSCoding (3)进行自定义对象的归档         上面介绍中有提到,原则上,任何遵守了NSCoding协议的类都可以进行归档操作,那么对于我们自定义的对象,我们该如何来做呢? 但是也带来了一个缺陷,每个类都需要实现NSCoding中的两个方法是十分繁琐的,并且类越复杂,这个步骤越繁琐,如果在之后的修改和优化中类做了改变,相应的方法也要做改变,这将增加很大的工作量并且埋下潜在bug 所以我们会想,能否设计一个这样的model基类,来使需要存储的model都继承于它,使我们的model不需要实现NSCoding方法的同时可以支持归档呢,通过runtime和OC语言特性的一些小技巧,我们是可以做到的

    1.4K30发布于 2018-08-16
  • 来自专栏滕先生的博客

    iOS应用数据存储(数据持久化)的常用方式一、iOS数据持久化方式二、应用沙盒(应用程序的文件夹)三、使用方法

    属性列表(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

    3.3K70发布于 2018-05-18
  • 来自专栏ShaoYL

    iOS Category实现原理

    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遵守两个协议<NSCoding,NSCopying> ### 4.最后我们可以看到属性列表 static struct /*_prop_list_t*/ { unsigned

    1.5K20发布于 2019-02-15
  • 来自专栏iOS122-移动混合开发研究院

    Mantle--国外程序员最常用的iOS模型&字典转换框架

    Mantle能做什么 Mantle可以轻松把JSON数据、字典(Dictionary)和模型(即Objective对象)之间的相互转换,支持自定义映射,并且内置实现了NSCoding和NSCoping, _retrievedAt = [NSDate date]; return self; } @end 很明显,我们不需要再去实现<NSCoding>, MTLModel可以用归档很好的存储模型而不需要去实现令人厌烦的NSCoding协议。 持久化 Mantle配合归档 MTLModel默认实现了 NSCoding协议,可以利用NSKeyedArchiver方便的对对象进行归档和解档。 Mantle配合MagicRecord(一个Core Data框架) Mantle为我们带来的好处 实现了NSCopying protocol,子类可以直接copy是多么爽的事情 实现了NSCoding

    2K60发布于 2018-01-02
  • 来自专栏娱乐心理测试

    NSUserDefaults数据保存报错:Attempt to set a non-property-list object.

    将PaymentModel类型变成NSData类型就必须实现归档,在PaymentModel.h文件中遵守NSCoding协议,在PaymentModel.m文件中实现encodeWithCoder和initWithCoder 如下所示: PaymentModel.h @interface PaymentModel : NSObject<NSCoding> //标题 @property (nonatomic, copy)NSString

    1.3K30发布于 2018-08-02
  • 来自专栏mukekeheart的iOS之旅

    iOS学习——iOS常用的存储方式

    归档在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 手动存放沙盒 手动将数据存放到沙盒

    3.7K100发布于 2018-03-01
  • 来自专栏落影的专栏

    iOS本地数据存储

    如果是NSString、NSNumber、NSData等基础类型可以直接存储在NSUserDefault,如果是自定义对象则需要实现NSCoding进行对象的序列化和反序列化。 有的开发者会使用系统提供的NSCoding协议手动添加字段,有的开发者会使用Runtime自动实现NSCoding,有的开发者会使用成熟的第三方库(例如YYModel),下面分别介绍这几种序列化的方式。 NSCoding是系统提供的序列化协议,在对象转换为二进制的时候,会通过NSCoding的方法回调开发者。 @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; - (nullable instancetype)initWithCoder: 在将对象转换成二进制数据,以及将二进制数据转换成对象时,可以使用系统提供的NSCoding协议,也可以使用第三方库YYModel。 所有代码GitHub可见,地址。

    3.7K20发布于 2019-07-15
  • 来自专栏菩提树下的杨过

    objective-C中的序列化(serialize)与反序列化(deserialize)

    如果你用来存放数据的类是自己定义的,并不是上面这些预置的对象,那么就要借助正式协议NSCoding来实现序列化和反序列化。 比如,我们有一个自己的类Sample.h #import <Foundation/Foundation.h> @interface Sample : NSObject<NSCoding> { NSString magicNumber,shoeSize,subThingies]; return (description); } @end 注意其中的:encodeWithCoder与initWithCoder,这是NSCoding

    2.2K50发布于 2018-01-22
  • 来自专栏iOS开发~

    iOS_指定初始化方法Designated Initializer和非指定初始化方法Secondary Initializer

    如:NSCoding协议提供了“序列化机制”(serialization mechanism), 对象可依次指明其自身的 编码encode 及 解码decode 方式。 下面上代码: @interface Rectangle : NSObject <NSCoding> // 属性声明为只读,外界就无法设置Rectangle对象的属性了,只能通过初始化方法设置 @property decodeFloatForKey:@"width"]; _height = [coder decodeFloatForKey:@"height"]; } // 这样写出来的类就完全遵守了NSCoding 协议(fully NSCoding compliant) return self; } @end @interface Square : Rectangle @property (nonatomic

    79530编辑于 2022-07-20
  • 来自专栏iOS 开发杂谈

    浅谈 NSUserDefaults

    但是并不是所有类型的对象都能够直接放入 NSUserDefaults,NSUserDefaults 只支持 Foundation 类型的对象,如果自定义 NSObject 对象存入 NSUserDefaults 就要实现 NSCoding 协议了,比如: @interface Person : NSObject<NSCoding> @property (nonatomic, copy) NSString *age; @property

    81160发布于 2018-09-30
  • 来自专栏技术总结

    iOS进阶之runtime作用

    2、作用 1.动态交换两个方法的实现 2.为类别添加属性(我们知道类别是不能扩展属性的,只能扩展方法,但可以运行时实现,通过为类增加属性) 3.获取某个类的所有成员变量和成员方法 4.实现NSCoding class_copyPropertyList返回的仅仅是对象类的属性(@property申明的属性),而class_copyIvarList返回类的所有属性和变量(包括在@interface大括号中声明的变量) 四、实现NSCoding if (self = [super init]) { [self decode:aDecoder]; } return self; } 当然还可以更加简洁,把NSCoding

    82190发布于 2018-05-22
  • 来自专栏sweet_iOS

    探寻iOS之协议(protocol)

    因为上文提到过,protocol不能定义成员变量,但是能够声明属性,因为属性=成员变量+setting方法+getting方法 <NSCopying> @protocol NSCoding - (void are safe to be encoded and decoded across privilege boundaries should adopt NSSecureCoding instead of NSCoding @protocol NSSecureCoding <NSCoding> @required // This property must return YES on all classes that allow class, readonly) BOOL supportsSecureCoding; #else + (BOOL)supportsSecureCoding; #endif @end 苹果在iOS6引入的基于NSCoding 大部分支持NSCoding的系统对象都已经升级到支持NSSecureCoding; 常用于对象编解码; 致谢 感谢雨雪传奇的作品 感谢黄龙辉的作品

    1.9K20发布于 2020-12-23
  • 来自专栏老司机的简书

    老司机出品——数据持久化之基于FMDB的ORM数据库设计

    想要归解档,你的模型首先要遵循<NSCoding>协议。然后在需要归档或解档的地方直接调用对应方法即可。 示例代码: ///类A @interface A : NSObject<NSCoding> @property (nonatomic ,strong) NSString * name; @property NSLog(@"fail"); } 另外,在实现两个协议方法时,你也可以通过runtime获取属性列表来自动完成转换,但是你要注意的是,想使用runtime自动转的话,你的所有属性最好都是遵循<NSCoding 归档的优势在于它支持对象的持久化了而不是那几种特殊的数据类型,悲催的是,你仍需要确保你要归档的属性的数据类型是遵循<NSCoding>的。

    1.5K30发布于 2018-08-22
  • 来自专栏落影的专栏

    iOS序列化的进阶方案——Protocol Buffer

    在本地存储时,我们可以使用YYModel将对象转成json对应的NSData,也可以使用NSKeyedArchiver结合实现NSCoding协议把对象转成NSData,进而将二进制数据存储在沙盒中或者数据库 因为项目中序列化数据到沙盒是一个高频场景,尝试过数据库、NSCoding+NSKeyedArchiver、YYModel等方法都有各自瓶颈:数据内容比较大数据库会造成体积膨胀过快不便管理,NSCoding

    2.1K20发布于 2020-03-20
领券