http://www.ox-holdings.com

摘要即时通讯云网易云信于2018年08月07日发布5.新匍京娱乐场官方下载:5版,//返回一个ASCII编码格式的字符串

摘要即时通信云腾讯网云信于二零一八年012月07日发表5.5版,此次更新为主要版本更新,实际情况见文章内容。发表的版本此番发表的版本号为 5.5版,更新时间为:二零一八年011月07日。iOS 更新内容新添NIMSDK设置新添NOS财富情况结构字段@interface NIMSDK : NSObject@property (nonatomic,strongState of Qatar NSMutableDictionary *sceneDict;@end能源管理新添对气象帮助的财富上传递口@protocol NIMResourceManager <NSObject>- (voidState of Qatarupload:(NSString *)filepath scene:(NSString *卡塔尔国scene progress:(nullable NIMHttpProgressBlock)progress completion:(nullable NIMUploadCompleteBlockState of Qatarcompletion;@end图片实例对象新增加场景起初化接口@interface NIMImageObject : NSObject- (instancetypeState of QatarinitWithImage:(UIImage*)image scene:(NSString *)scene;- (instancetype)initWithFilepath:(NSString *)filepath scene:(NSString *)scene;- (instancetype)initWithData:(NSData *)data extension:(NSString *)extension scene:(NSString *卡塔尔国scene;@end摄像实例对象新扩大场景伊始化接口@interface NIMVideoObject : NSObject- (instancetype卡塔尔initWithSourcePath:(NSString *)sourcePath scene:(NSString *)scene;- (instancetype)initWithData:(NSData *)data extension:(NSString *)extension scene:(NSString *卡塔尔国scene;@end语音实例对象新扩张场景初阶化接口@interface NIM奥迪(Audi卡塔尔oObject : NSObject- (instancetypeState of QatarinitWithSourcePath:(NSString *)sourcePath scene:(NSString *)scene;- (instancetype)initWithData:(NSData *)data extension:(NSString *)extension scene:(NSString *卡塔尔国scene;@end文件实例对象新增添场景开头化接口@interface NIMFileObject : NSObject- (instancetype卡塔尔initWithSourcePath:(NSString *)sourcePath scene:(NSString *)scene;- (instancetype)initWithData:(NSData*)data extension:(NSString*)extension scene:(NSString *卡塔尔scene;@end语音实例对象新扩充音频MD5字段@interface NIMAudioObject : NSObject@property (nullable,nonatomic, copy, readonly卡塔尔 NSString *md5;@end图片实例对象新添图片MD5字段@interface NIMImageObject : NSObject@property (nullable,nonatomic, copy, readonly卡塔尔国 NSString *md5;Android 更新内容新扩展1. NOS场景布局2. 发送音信时方可钦定 NOS 场景3. 上传文件时能够钦定 NOS 场景Windows(PCState of Qatar SDK 更新内容新增Gavin件上传扩充“场景”新闻运用5.5版本及其以上SDK(PC端、移动端、web端)实现的客户端(简单的称呼:5.5+ SDK),向利用PC5.4及其以下版本SDK完成的顾客端(简单的称呼:PC 5.4- SDK),发送图片消息且顾客端开启下载缩略图效用时(即:5.5+ SDK 向 PC 5.4- SDK(preloadattach=trueState of Qatar,发送图片新闻State of Qatar,接受到的缩略图片恐怕是原图。提出提高SDK到5.5会同以上版本可能在UI层对缩略图做缩放管理。本地数据文件(*.db卡塔尔备份成效修复Windows x64 下http库恐怕引起的崩溃Web SDK 更新内容新扩大IM,chatroom领头化扩张文件存款和储蓄配置IM,chatroom发送文书音讯增Gavin件存款和储蓄配置下载地址请从以下官方网址地址下载:

  • 如何是单例格局
  • 编纂严谨的单例
  • 用单例优化地面存款和储蓄

@interface NSData: NSObject<NSCopying, NSMutableCopying, NSSecureCoding>

技艺痛点

     后台重返protobuf格式数据对于前端开辟实际上并非很便捷 , 只要扩张还是裁减哪怕二个字段 , 前端全数关于那些文件的保有业务全部就炸掉了 .  每一遍都要重复编写翻译probuf文件(请参谋笔者上一篇随笔State of Qatar .

   使用protobuf爽的一点是不用建立模型型 , 因为它本身正是模型 .那对于面向数据模型开垦的前端是很要好的 . 凡是都有两面性 , 在众多的职业逻辑中 , 要求修正模型数值 , 这个时候protobuf的害处就表现出来了 , 数值不得改良. 那是老大优伤的一件事 . 所以实际上比比较多状态下 , 都需求和睦建立模型(说来不及Jason卡塔尔(قطر‎ .

为此会写下大量之类的代码

新匍京娱乐场官方下载 1

滑稽.jpg

每二回建立模型, 都须求这么贰个一个赋值 , 劳动量相当大 , 并且聊无意义 .  搬砖大大缩短了工效 . 

摘要即时通信云新浪云信于前年0九月五日宣布4.2版,本次更新为主要版本更新,详细情况见小说内容。公布的本子本次公布的版本号为 4.2版,更新时间为:二〇一七年04月二七日。iOS 更新内容新扩展谈天室协理 bot 机器人,使用办法与平日音信无差别于。增添是或不是将群布告计入未读的开关@interface NIMSDKConfig : NSObject/** * @discusssion 默感到 NO。设置成 YES 的意况下,收到的群通告也会计入未读数 */@property (nonatomic,assign卡塔尔国BOOL shouldCountTeamNotification;@end加多日志最大存在天数设置@interface NIMSDKConfig : NSObject/** * @discusssion 默以为 7 天。即超过 7 天的 log 将被免除。只可以设置大于等于 2 的值。 */@property (nonatomic,assign卡塔尔国NSInteger maximumLogDays;@end变再创造群接口更换/** * 创设群组 * * @param option 创制群选项 * @param users 用户ID列表 * @param completion 完结后的回调 */- (void)createTeam:(NIMCreateTeamOption *)option users:(NSArray<NSString *> *卡塔尔国users completion:(nullable NIMTeamCreateHandler卡塔尔国completion;创设群变成的回调由/** * 成立群组block * * @param error 错误,即便成功则error为nil * @param teamId 群组ID */typedef void(^NIMTeamCreateHandler)(NSError * __nullable error,NSString * __nullable teamId);变更为/** * 创制群组block * * @param error 错误,假如成功则error为nil * @param teamId 群组ID * @param failedUserIds 诚邀退步的群成员ID */typedef void(^NIMTeamCreateHandler)(NSError * __nullable error, NSString * __nullable teamId, NSArray<NSString *> * __nullable failedUserIds卡塔尔(قطر‎;以往创办群恐怕会情不自禁建群成功,建群同一时候约请的客商部分成功的意况。此时建群依然成功,error 音讯为 nil ,并赶回约请战败的群成员 ID 集结。Android 更新内容新扩张1. 抬高闲聊室 bot 机器人效用,增多机器人上行新闻创设接口:ChatRoomMessageBuilder#create罗布otMessage。2. 报到选项加多群通知新闻是还是不是计入未读数开关:SDKOptions#teamNotificationMessageMarkUnread。改变1. 对单个顾客所在群的数据增加限定,影响到接口:TeamService#createTeam, 重回结果CreateTeamResult,满含诚邀失利账号列表TeamService#addMembers, 重回结果 List,即诚邀失败账号列表借使诚邀成员中有群数量超过限制,重临码仍为马到成功,而且同不经常候重临这一部分超过限度的账号。2. 消除登入偶现登陆 417 难题。3. 添Garden录同步败北景况管理。4. 加多 IPC ACK 机制,消除极端情状下群音讯遗失的标题。5. 解决 HttpDownload 安全警告难题。Windows(PC卡塔尔 SDK 更新内容新添群公告消息是还是不是计为未读数大增开关配置 nim_client.h闲聊室扶植机器人修复修复有个别场景下群成员同步bugWeb SDK 更新内容新添谈天室佚名登陆闲聊室机器人及其发生音信接口闲谈室获取机器人接口下载地址请从以下官方网址地址下载:

新匍京娱乐场官方下载 2

//获取data长度的品质

思考

       如何动态的去给模型赋值 ? 是的 , runtime . 关于runtime的知识 , 英特网海重机厂重 , 书籍也正如多 . 这里就不赘述了 .

Paste_Image.png

@property (readonly) NSUInteger length;

灵感

        在看ibireme大神的YYCategories中有关NSObject的恢弘获得灵感 . 关于获取模型属性列表的片段代码也是借(chao卡塔尔(قطر‎鉴(xi卡塔尔(قطر‎于此 , 向大神致(guiState of Qatar敬(tian卡塔尔 .

  • 单例情势的基本原理:
    系统中的类只有三个实例且轻便外部访谈。

  • 单例方式用于缓慢解决何种难点?

  • 单例情势的利弊

  • 系统中的单例比方

//再次回到data对象的首指针

实现

1 . 创制TestModel , 这是头文件 .

#import <Foundation/Foundation.h>

@interfaceTestModel :NSObject

/**公司号(测量检验数据卡塔尔**/

@property(nonatomic,strong)NSString*clientNo;

/**顾客号(测验数据卡塔尔(قطر‎**/

@property(nonatomic,strong)NSString*userNo;

/**语言号(测验数据卡塔尔**/

@property(nonatomic,strong)NSString*languageNo;

/**环信顾客名(测验数据卡塔尔国**/

@property(nonatomic,strong)NSString*huanXinUserName;

/**环信密码(测量检验数据卡塔尔(قطر‎**/

@property(nonatomic,strong)NSString*huanXinPassword;

/**公司全称(测量试验数据卡塔尔**/

@property(nonatomic,strong)NSString*clientFullName;

/**公司简单称谓(测验数据卡塔尔(قطر‎**/

@property(nonatomic,strong)NSString*clientShortName;

/**客商名(测量检验数据卡塔尔国**/

@property(nonatomic,strong)NSString*userName;

/**密码(测量试验数据State of Qatar**/

@property(nonatomic,strong)NSString*password;

/**地址(测验数据卡塔尔国**/

@property(nonatomic,strong)NSString*address;

/**

最早化模型

@paramdata服务器重返的还没深入解析的protobuf二进制文件(如若是观念Jason,也能够这么干,假若须求笔者会写一下卡塔尔国

@paramname protobuf名字

@return<#return value description#>

*/

- (instancetype)initWithData:(NSData*)data protobufName:(NSString*)name;

+ (instancetype)modelWithData:(NSData*)data protobufName:(NSString*)name;

/**

测量试验打字与印刷当前Model的属性值

*/

- (void)showModelProperty;

@end

xxx

```

2 . m文件

#import"TestModel.h"

#import

#import

@implementationTestModel

//开首化(对象方法State of Qatar

- (instancetype)initWithData:(NSData*)data protobufName:(NSString*)name{

if(self= [superinit]) {

[self readPropertyWithProtobuf:data  protobufName:name];

}

returnself;

}

//初始化(类方法)

+ (instancetype)modelWithData:(NSData*)data protobufName:(NSString*)name{

return [[self alloc] initWithData:dataprotobuf Name:name];

}

//依据protobuf文件名字和二进制数据,生成protobuf文件并收获属性赋值给Model

- (void)readPropertyWithProtobuf:(NSData*)data protobufName:(NSString*)name{

if(data==nil) {

return;

}

//依照字符串获取类

Class modelClass =NSClassFromString(name);

//利用runtime依照类获取属性列表

NSArray*propertyAry= [self  allProperty:modelClass];

//将二进制数据转成model

id  model = [[model  Classalloc]  initWithData:dataerror:nil];

for(inti =0; i < propertyAry.count; i++) {

//获取Get方法

SEL  getSEL = [self  makeGetterWithPropertyName:propertyAry[i]];

//获取Set方法

SEL  setSEL = [self  makeSetterWithPropertyName:propertyAry[i]];

if([self  respondsToSelector:getSEL]) {

//获取类和格局的具名

NSMethodSignature*signature = [model  methodSignatureForSelector:getSEL];

//依据签订公约得到调用对象

NSInvocation*invocation = [NSInvocation  invocationWithMethodSignature:signature];

[invocation  setTarget:model];

[invocation  setSelector:getSEL];

NSObject*__unsafe_unretainedreturnValue =nil;

[invocationinvoke];

//获取protobuf属性重返值(好似jason的依赖key获取value卡塔尔(قطر‎

[invocation  getReturnValue:&returnValue];

if(returnValue !=nil) {

//赋值给Model(关键步骤State of Qatar

[self  performSelectorOnMainThread:setSEL  withObject:returnValuewaitUntilDone:[NSThread  mainThread]];

}

}

}

}

//获取属性(借鉴于ibireme卡塔尔国

- (NSArray*)allProperty:(Class)class{

unsigned intproperty Count =0;

objc_property_t* properties =class_copyPropertyList(class, &propertyCount);

NSMutableArray* propertyNames = [NSMutableArray array];

for(unsigned int i =0; i < propertyCount; ++i) {

objc_property_tproperty = properties[i];

constchar* name =property_getName(property);

[property NamesaddObject:[NSString stringWithUTF8String:name]];

}

free(properties);

return propertyNames;

}

//依据字符串生成get方法

- (SEL)makeGetterWithPropertyName:(NSString*)propertyName{

return  NSSelectorFromString(propertyName);

}

//根据字符串生成set方法

- (SEL)makeSetterWithPropertyName:(NSString*)propertyName{

//首字母大写

NSString*firstWord = [property  NamesubstringToIndex:1];

firstWord = [firstWord  uppercaseString];

propertyName = [NSString  stringWithFormat:@"%@%@",firstWord , [propertyName  substringFromIndex:1]];

//拼接上set

propertyName = [NSString  stringWithFormat:@"set%@:", propertyName];

return  NSSelectorFromString(propertyName);

}

//测量检验是不是赋值成功,可以删掉.

- (void)showModelProperty{

//获取实体类的属性名

NSArray*array = [self  allProperty:self.class];

//拼接参数

NSMutableString*resultString = [[NSMutable  Stringalloc]  init];

for(inti =0; i < array.count; i ++) {

//获取get方法

SEL getSel = [self  makeGetterWithPropertyName:array[i]];

if([self  respondsToSelector:getSel]) {

//获得类和办法的签名

NSMethodSignature*signature = [self  methodSignatureForSelector:getSel];

//从具名获得调用对象

NSInvocation*invocation = [NSInvocation  invocationWithMethodSignature:signature];

//设置target

[invocation  setTarget:self];

//设置selector

[invocation  setSelector:getSel];

//接纳重临的值

NSObject*__unsafe_unretainedreturnValue =nil;

//调用

[invocation  invoke];

//选用再次来到值

[invocation  getReturnValue:&returnValue];

[resultString  appendFormat:@"%@n", returnValue];

}

}

NSLog(@"%@", resultString);

}

@end

xxxx

@property (readonly) const void *bytes;

调用

//"LoginResMsg"正是protobuf文件的称谓字符串userInfo正是二进制数据 .

TestModel*model = [[TestModel  alloc]  initWithDictionary:userInfo protobufName:@"LoginResMsg"];

//测验是不是赋值成功

[model showModelProperty];

[[UIApplication sharedApplication] statusBarStyle];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notififationAction) name:@"noti" object:nil];
    [[NSUserDefaults standardUserDefaults] setObject:@"user" forKey:@"user"];
    [NSFileManager defaultManager];```

观察系统的单例类之后,我们都会发现单例的类都会通过一个方法来获取这个类实例,然后通过这个实例来做一些事情。单例一般都是用来管理某种资源,某种对象,而这个对象拥有某些属性供全局使用。
大部分情况,我们使用单例是为了共享信息。
缺点:因为他共享了信息,破坏了最少支持原则
破坏了封装性。
但是解决实际问题的时候也是可以忽略的。

- 我们来写一个用户信息管理中心单例

@interface NSData (NSExtendedData)

打印

新匍京娱乐场官方下载 3

滑稽.jpg

import <Foundation/Foundation.h>

@interface UserInfoManagerCenter : NSObject

@property(nonatomic, copy) NSString * name;
@property(nonatomic, strong) NSNumber * age;

  • (instancetype)managerCenter;

@end```

h:

#import "UserInfoManagerCenter.h"

@implementation UserInfoManagerCenter

#pragma mark - 第三种创建单例的方法,不好,即写在这个类里面,因为此类是任何一个类在调用类方法之前必须调用的方法
+ (void)initialize{
    static UserInfoManagerCenter *center = nil;
    if (self == [UserInfoManagerCenter class]) {
        center = [[UserInfoManagerCenter alloc] init];
    }

}

#pragma mark - 一般解决方案,不好,如果AppDelegate和ViewController同时访问这个单例,如果同时进入方法进行初始化,那么就会出现问题
+ (instancetype)managerCenter{

    // 用静态变量持有对象
    static UserInfoManagerCenter *center = nil;
    if (center == nil) {
        center = [[UserInfoManagerCenter alloc] init];
    }
    return center;
}

#pragma mark - 好的解决方案,用dispatch_once来解决他们的竞争问题
+ (instancetype)managerCenter{
    static UserInfoManagerCenter *center = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        center = [[UserInfoManagerCenter alloc] init];
    });
    return center;
}

@end```

- 使用单例
AppDelegate中赋值
  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    UserInfoManagerCenter *center = [UserInfoManagerCenter managerCenter];
    center.name = @"贾元发";
    center.age = @23;
    return YES;
    }```

viewController中取出

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [[UIApplication sharedApplication] statusBarStyle];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notififationAction) name:@"noti" object:nil];
    [[NSUserDefaults standardUserDefaults] setObject:@"user" forKey:@"user"];
    [NSFileManager defaultManager];

    UserInfoManagerCenter *center = [UserInfoManagerCenter managerCenter];
    NSLog(@"%@%@",center.name,center.age);

}```


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/189984-61a92c34d4be032a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

以上是一个单例的典型用法,但是并不是完美单例,因为我们还能通过alloc init方法再次创建对象,严格来说是不行的。

- 那么如何实现一个严格的单例模式?

我们可以写一个方法,以检测单例方法实现只有UserInfoManager类在调用,如果是别的类在调用会直接导致崩溃,这个怎么实现呢?

- 如何防止子类继承?

//再次回到叁个ASCII编码格式的字符串,接收的格式是data属性列表的格式

完结

因为杰森的深入分析已经有比很多成熟的框架 , YYModel , MJExtension 等等 .protobuf那东西用得十分少 , 请参考 .

pragma mark - 好的消除方案,用dispatch_once来消除他们的竞争难题

  • (instancetype)managerCenter{
    static UserInfoManagerCenter *center = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
    center = [[UserInfoManagerCenter alloc] init];
    });

    // 制止子类使用
    // 获取类名
    NSString *classString = NSStringFromClass([self class]);
    // 推断是还是不是与本类类名相通
    if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) {
    // 倘使不直接崩溃
    NSParameterAssert(nil);
    }
    return center;
    }```

  • 何以保管实例对象只现出八个

新匍京娱乐场官方下载 4

Paste_Image.png

上海体育场地我们用三种办法创建了单例类的实例对象,发掘打字与印刷出来之处并分裂样,那就诱致了单例对象不独一的主题材料

在贰个系统中,单例作为贰个管理宗旨指标,他的开辟是万分大的,所以保持独一性相当的重大,作者已大家不可能让单例通过alloc init方法初步化,换句话说大家要让这种开端化方法失效。

  • 先是步:重写单例类的init方法
    申明类全局静态

新匍京娱乐场官方下载 5

Paste_Image.png

在单例里面

新匍京娱乐场官方下载 6

Paste_Image.png

#pragma mark - 重写单例类的初始化方法
- (instancetype)init{
    // 用字符串接收静态变量
    NSString *string = (NSString *)center;
    // 判断是否是字符串类并且等于创建单例方法中的字符串
    if ([string isKindOfClass:[NSString class]] && [string isEqualToString:@"UserInfoManagerCenter"]) {
        self = [super init];
        if (self) {

        }
        return self;
    }else{
        // 如果不,则初始化返回为nil
        return nil;
    }
}
@end```

- 运行结果

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/189984-f9501aa9dc52cfd6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

发现用alloc init创建的对象已经为nil
当然我们也需要在init方法中实现子类的alloc init滞空

@property (readonly, copy) NSString *description;

pragma mark - 重写单例类的最初化方法

  • (instancetype)init{
    // 用字符串选择静态变量
    NSString *string = (NSString *)center;
    // 推断是还是不是是字符串类何况特别创设单例方法中的字符串
    if ([string isKindOfClass:[NSString class]] && [string isEqualToString:@"UserInfoManagerCenter"]) {
    self = [super init];
    if (self) {
    // 防止子类使用
    // 获取类名
    NSString *classString = NSStringFromClass([self class]);
    // 推断是不是与本类类名相仿
    if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) {
    // 要是不直接崩溃
    NSParameterAssert(nil);
    }

      }
      return self;
    

    }else{
    // 要是不,则早先化重临为nil
    return nil;
    }
    }
    @end```

  • 优化地面存款和储蓄
    1:用单例设计存款和储蓄数据接口
    2:用单例接口隔离实现细节
    3:在单例提供接口的幼功上拓宽上层封装

此地给大家推荐一个第三方: 法斯特Coding
github地址为:https://github.com/nicklockwood/FastCoding
以此第三方的强有力之处在于能够不遵循系统的NSCoding左券对模型、数组、等等数据实行仓库储存!上边大家用单例结合那些第三方对数据存款和储蓄封装一下吧!
率先,引入引入第三方运转之后察觉二个告诫!

新匍京娱乐场官方下载 7

Paste_Image.png

新匍京娱乐场官方下载 8

Paste_Image.png

告诫的意思是大家的种类采取了ARC,这么些第三方在ARC下运作缓慢,大家在此个文件后边增多-fno-objc-arc就能够

新匍京娱乐场官方下载 9

Paste_Image.png

双重运营开采警报消失

始于编制代码:
先是写一个单例用来储存数据:

#import <Foundation/Foundation.h>

@interface StoreValue : NSObject

+ (StoreValue *)shareInstance;  // 单例初始化

- (void)storeValue:(id)object withKey:(NSString *)key;  // 存储值
- (id)valueWithKey:(NSString *)key; // 取出

@end```

m文件

//抽取data中钦命长度的字节存入buffer那个提前证明的数组中

import "StoreValue.h"

- (void)getBytes:(void *)buffer length:(NSUInteger)length;

import "法斯特Coder.h" // 引进头文件

@implementation StoreValue

  • (StoreValue *)shareInstance{
    static StoreValue *storeValue = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
    storeValue = [[StoreValue alloc] init];
    });
    return storeValue;
    }
  • (void)storeValue:(id)object withKey:(NSString *)key{
    NSParameterAssert(object);
    NSParameterAssert(key卡塔尔国; // 空值崩溃
    // 把自由等级次序的对象用法斯特Codingl类变换为NSData类型存款和储蓄
    NSData *data = [FastCoder dataWithRootObject:object];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];

}

  • (id)valueWithKey:(NSString *)key{
    NSParameterAssert(key);
    NSData *data = [[NSUserDefaults standardUserDefaults] valueForKey:key];
    return [FastCoder objectWithData:data];
    }

@end```

  • 测试:

新匍京娱乐场官方下载 10

Paste_Image.png

早就有了值
上边大家来写贰个复杂的积攒,看看能或不能够兑现,首先我们来写七个模型

新匍京娱乐场官方下载 11

Paste_Image.png

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

//    NSArray *array = @[@"贾元发"];
//    [[StoreValue shareInstance] storeValue:array withKey:@"jia"];
//    NSLog(@"%@",[[StoreValue shareInstance] valueWithKey:@"jia"]);
    Student *student = [[Student alloc] init];
    student.name = @"jiayuanfa";
    NSArray *array = @[[Teacher new],[Teacher new],[Teacher new]];
    student.teachersArray = array;
    [[StoreValue shareInstance] storeValue:student withKey:@"stu"];
    Student *student1 = [[StoreValue shareInstance] valueWithKey:@"stu"];
    NSLog(@"%@",student1.name);
    NSLog(@"%@",student1.teachersArray);

}```

运行结果:

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/189984-bd2dbc0d84fbd362.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
发现复杂的数据我们也能存储

- 用类目对单例存储进行进一步上层的封装以便我们用对象直接调用存储的方法

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/189984-97c7257f1ce76cd2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

//抽取data中钦赐地点range的字节存入buffer这么些提前注明的数组中

import <Foundation/Foundation.h>

@interface NSObject (StoreValue)

// 加多类目方法

  • (void)storeValueWithKey:(NSString *)key;
  • (id)valueWithKey:(NSString *)key;

@end```

m

#import "NSObject+StoreValue.h"
#import "StoreValue.h"

@implementation NSObject (StoreValue)

- (void)storeValueWithKey:(NSString *)key{
    [[StoreValue shareInstance] storeValue:self withKey:key];
}

+ (id)valueWithKey:(NSString *)key{
    return [[StoreValue shareInstance] valueWithKey:key];
}

@end```

- (void)getBytes:(void *)buffer range:(NSRange)range;

import "ViewController.h"

//剖断三个data是不是等于

import "StoreValue.h"

- (BOOL)isEqualToData:(NSData *)other;

import "Teacher.h"

//截取data钦点地方的子data

import "Student.h"

- (NSData *)subdataWithRange:(NSRange)range;

import "NSObject+StoreValue.h"

@interface ViewController ()

@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

// NSArray *array = @[@"贾元发"];
// [[StoreValue shareInstance] storeValue:array withKey:@"jia"];
// NSLog(@"%@",[[StoreValue shareInstance] valueWithKey:@"jia"]);
Student *student = [[Student alloc] init];
student.name = @"jiayuanfa";
NSArray *array = @[[Teacher new],[Teacher new],[Teacher new]];
student.teachersArray = array;
// [[StoreValue shareInstance] storeValue:student withKey:@"stu"];
// 模型调用直接存款和储蓄
[student storeValueWithKey:@"stu"];
Student *student1 = [Student valueWithKey:@"stu"];
NSLog(@"%@",student1.name);
NSLog(@"%@",student1.teachersArray);

}```

结果:

新匍京娱乐场官方下载 12

Paste_Image.png

上述大家对单例存款和储蓄用类目实行了更进一层的包裹。

需求通晓的技术:
1:单例主题原理
2:严谨单例理念
3:用单例优化存储情势

//将data写入钦定的文本

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

//将data写入钦定的url

- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;

//将data写入钦赐文件,并且有写入进程的设置条件,带错误新闻

- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)writeOptionsMark error:(NSError **)errorPtr;

//将data写入内定的url,而且有写入进程的安装标准,带错误消息

- (BOOL)writeToURL:(NSURL *)url options:(NSDataWritingOptions)writeOptionsMark error:(NSError **)errorPtr;

//找出在data1内部存在data2的职位,而且有追寻配置原则,并且可进入的寻觅的限定

- (NSRange)rangeOfData:(NSData *)dataToFind options:(NSDataSearchOptions)mark range:(NSRange)searchRange;

//列举遍历辞典的议程

- (void)enumerateByteRangesUsingBlock:(void (^)(const void *bytes, NSRange byteRange, BOOL *stop))block;

@end

@interface NSData (NSDataCreation)

//data的敏捷创建文明城市委员会办公室公室公室法

+ (instancetype)data;

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。