在使用kvc进行赋值的时候,有时候会遇到null值,这个时候我们使用kvc会报错

在使用kvc进行赋值的时候,有时候会遇到null值,这个时候我们使用kvc会报错,如何解决

控制器代码如下:

//
//  ViewController.m
//  02-模型中的赋值
//
//  Created by jerry on 15/9/29.
//  Copyright (c) 2015年 jerry. 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"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:4.0f];
    // queue  如果给一个nil  那么就是没有队列。
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        NSLog(@"%@",result);
        Message *mes = [[Message alloc] init];
        [mes setValuesForKeysWithDictionary:result];
        NSLog(@"%@",mes);
    }];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

message的.h文件

#import <Foundation/Foundation.h>

@interface Message : NSObject

@property(nonatomic,assign)int  messageId;

@property(nonatomic,copy)NSString *message;

@end

message的.m文件

#import "Message.h"

@implementation Message
/**
 *  NSLog的时候会调用这个方法
 *
 *  @return <#return value description#>
 */
- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@:%p>{messageId:%d,message:%@}",self.class,self,_messageId,_message];
}
@end

dome.json

{
    "messageId" : null,
    "message" : "明天天气怎么样"
}

在运行这段代码后会有报错 , 报错提示如下:

‘[<Message 0x7f91785965f0> setNilValueForKey]: could not set nil as the value for the key messageId.‘

原因就处在了kvc 自动赋值这里,由于messageId的返回值是null,而message的属性中int 类型的messageId 是不可以为空的。所以就会报错,那么如何更改这个错误呢,我们在网络开发中所有的数值类型都需要用NSNumber进行修饰,而不是采用int去修饰,更改message的.h文件,如下代码

#import <Foundation/Foundation.h>

@interface Message : NSObject

@property(nonatomic,assign)NSNumber * messageId;

@property(nonatomic,copy)NSString *message;

@end
时间: 2024-10-10 23:36:34

在使用kvc进行赋值的时候,有时候会遇到null值,这个时候我们使用kvc会报错的相关文章

Java千问:Java语言中为byte和short类型变量赋值为啥会报错?

咱们先来看一段很简单的Java代码这段代码非常简单,没有任何技术含量.但是,如果我们把这段代码改成下面的样子大家可以看到,我们只是用一个变量a代替了原来赋值表达式当中的常量1,就会出现语法错误,这是为什么呢?今天我们就用一篇短文来聊聊这个话题.我们知道,Java语言中有4种整数类型,分别是byte.short.int和long.其中,Java编译器对byte和short类型的变量在赋值的时候,做了一点点"特殊检查".那么编译器如何"特殊检查"这两种类型的变量呢?当编

[原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

const变量赋值报错分析

const变量赋值报错分析 const变量赋值报错 从变量到常量的赋值是合法C++的语法约定的, 如从char 到const char顺畅: 但从char **到 const char **编译器就会报错: error: invalid conversion from `char**' to `const char**' 示例: int main(int argc, char *argv[]) { char a = '1'; const char b = a; char * a2 = "1234

随机为一维数组赋值,找出其中的第二大值

int a[20] = {0}; 为数组中的元素赋值 for (int i = 0;  i < 20; i++) { a[i] = arc4random() % (50 - 10 + 1) + 10; printf("%d", a[i]); printf("\n"); } int max = a[0], sex = a[0]; max最大  sex第二大 for (int i = 0; i < 20; i++) { if (max < a[i])

[cocos2d-x][apk打包][Fatal signal 11][andriod]Eclipse编译Fatal signal 11报错-都是字符赋值惹的祸

流程重现: 使用coco2d-x制作了一个2048,在xcode模拟器运行以及在pad上真机调试都是没有问题的,但是在使用eclipse调试打包android能够运行,但是进入游戏之后会在随机的地方闪退,debug模式报错为: 10-20 11:48:36.413: A/libc(17408): Fatal signal 11 (SIGSEGV) at 0x68d7b0b8 (code=2), thread 17426 (Thread-7958) 在网上查到关于这个问题的n中说法,包括andro

dovecot并发数造成foxmail、outlook等客户端工具接收邮件有时候报错

问题:dovecot并发数造成foxmail.outlook等客户端工具接收邮件有时候报错,频繁点收取邮件报错. /var/log/maillog日志有大量的报错: Jan 24 14:01:33 mail dovecot: imap-login: Error: read(imap) failed: Remote closed connection (service's process_limit reached?) 1.看报错应该是dovecot最大并发数的问题(默认是2048),使用这个命令

dovecot vsz_limit参造成foxmail、outlook等客户端工具接收邮件有时候报错

问题:dovecot并发数造成foxmail.outlook等客户端工具接收邮件有时候报错,关闭客户端工具后又可以了. /var/log/maillog日志有大量的报错: Jan 25 08:18:35 localhost dovecot: auth: Fatal: master: service(auth): child 60976 returned error 83 (Out of memory (service auth { vsz_limit=256 MB }, you may need

记录一个python里面很神奇的操作,对一个包含列表的元组进行增量赋值,成功赋值但还报错

记录一个python里面很神奇的操作 今天记录一个很神奇的操作.关于序列的增量赋值.如果你很熟悉增量赋值,你也不妨看下去,我想说的是有关于增量赋值和元组之间一种神奇的操作.来自 <流畅的Python> 一书,让我们更加深入地了解里面的原理 神奇的操作 >>>t = (1,2,[30,40]) >>>t[2] += [50,60] 上面这段代码会出现什么样的情况 a. t会变成(1,2,[30,40,50,60]) b. 因为tuple不支持对它的元素赋值,所

py+selenium 直接给日期赋值,控制台调试报错【已解决】

目标:给带日期控件的输入框赋值. 百度去搜索让你各种去只读readonly属性,再send_keys 方法: 其实既然可以去除readonly属性,那就可以直接给属性赋值,将两行代码缩为一行. driver.execute_script("document.getElementById('planDate').value=20181010;") 这样一行直接搞定. 个人遇到过的一些问题: 当在控制台调试js的时候,可能会遇到控制台报错.控制台报错:无法设置未定义或null引用的属性&q