新建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

相关文章

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

Java中InputStream重复使用问题的几种解决方案

《Java中InputStream重复使用问题的几种解决方案》在Java开发中,InputStream是用于读取字节流的类,在许多场景下,我们可能需要重复读取InputStream中的数据,这篇文章主... 目录前言1. 使用mark()和reset()方法(适用于支持标记的流)2. 将流内容缓存到字节数组

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列