新建Model涉及基本数据类型必须注意的问题——将基本数据类型转为NSNumber类型

本文主要是介绍新建Model涉及基本数据类型必须注意的问题——将基本数据类型转为NSNumber类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将请求的数据使用KVC转为Model类型时,必须注意的是:

Model中涉及基本数据类型的属性都设置为NSNumber类型。否则如果使用基本数据类型的作为Model的属性当那么服务器端将这个属性的值改为null的时候,程序就会崩溃。所以以后无论建立任何Model类型都将基本数据类型设置为NSNumber类型。

新建工程:

打开本地Apache服务器中的demo.json如下:


具体代码如下:

为了不影响测试效果,所以在发送请求时使用了缓存策略——并传枚举值为1(意思是每次运行不加载缓存)

Message.h

//
//  Message.h
//  模型中的数值问题
//
//  Created by apple on 15/10/27.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//#import <Foundation/Foundation.h>@interface Message : NSObject
//  @property(nonatomic, assign) int messageId;
/*@property(nonatomic, assign) int messageId; ——>Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[<Message 0x7fae89f933e0> setNilValueForKey]: could not set nil as the value for the key messageId.'First throw call stack:*/
/*使用NSNumber类型,防止服务器返回null,我们使用KVC赋值将会崩溃的问题*/
@property(nonatomic, copy)NSNumber *messageId;
@property(nonatomic, copy) NSString *message;@end

Message.m

//
//  Message.m
//  模型中的数值问题
//
//  Created by apple on 15/10/27.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//#import "Message.h"@implementation Message-(NSString *)description
{return [NSString stringWithFormat:@"<%@, %p>{messageId: %d, messgage: %@}", self.class, self, self.messageId.intValue, self.message];
}
@end
viewController.m

//
//  ViewController.m
//  模型中的数值问题
//
//  Created by apple on 15/10/27.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//#import "ViewController.h"
#import "Message.h"
@interface ViewController ()@end@implementation ViewController-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/demo.json"];// 为了便于测试,将缓存策略置为1表示不加载缓存NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:5];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {NSLog(@"%@", [NSThread currentThread]);id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];NSLog(@"%@", result);Message *message = [[Message alloc] init];[message setValuesForKeysWithDictionary:result];NSLog(@"message= %@", message);}];
}@end
运行结果如下:

当我们用基本数据类型时,且后台此基本类型数据不为null时结果如下:



修改本地服务器的后台数据将基本数据类型messageId值改为null如下图:


打开网页刷新如下:


再次点击屏幕后台运行效果如下:


发现程序崩溃。

修改Model中的基本数据类型的messageId属性将其类型改为NSNumber类型。重新运行,效果如下:


发现如果服务器端数据类型为null时,Model中对应的NSnumber类型的属性的整型值变为0。但程序不会崩溃。

这篇关于新建Model涉及基本数据类型必须注意的问题——将基本数据类型转为NSNumber类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115264

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C