记一次对象归档中的错误, initWithCoder报

最近在使用initWithCoder中遇到了野指针的问题;

情形如下:

父类的initwithcoder:

- (id)initWithCoder:(NSCoder *)aDecoder{
    NSDictionary *info = [aDecoder decodeObjectForKey:@"info"];
    self = [[YFModel alloc]initWithInfo:info];
    return self;
}

子类的initithcoder:

- (id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self){
        _newsTitle = [aDecoder decodeObjectForKey:@"newstitle"];
        _newsDescription = [aDecoder decodeObjectForKey:@"newsDescription"];
        _newsID = [aDecoder decodeObjectForKey:@"newsID"];
        _thumb = [aDecoder decodeObjectForKey:@"thumb"];
        _newsEditor = [aDecoder decodeObjectForKey:@"newsEditro"];
        _newsDetail = [aDecoder decodeObjectForKey:@"newsDetail"];
    }
    return self;
}

调试中出现如下错误:

执行

_newsTitle = [aDecoder decodeObjectForKey:@"newstitle"];

时遇到野指针问题。原因是父类的初始话方法中执行了

self = [[YFModel alloc]initWithInfo:info];

,对内存空间重新分配,子类

self = [super initWithCoder:aDecoder];

得到的指针为父类类型,内存中没有

_newsTitle_newsDescription_newsID_thumb_newsEditor_newsDetail

这些实例变量,所以报错。更改方法,在父类的初始化方法中万万不能alloc

- (id)initWithCoder:(NSCoder *)aDecoder{
    self = [super init];
    _info = [aDecoder decodeObjectForKey:@"info"];
    return self;
}

改正这样既可。

时间: 2024-08-02 03:27:24

记一次对象归档中的错误, initWithCoder报的相关文章

元数据管理器中存在错误。 实例化来自文件“\\?\C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Data\Tfs_Analysis.0.db\vDimTestCaseOverlay.874.dim.xml”的元数据对象时出错。

一.发现问题 启动SQLSERVER的数据分析服务失败 查看系统日志错误如下: 双击错误后显示详细错误: 元数据管理器中存在错误. 实例化来自文件“\\?\C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Data\Tfs_Analysis.0.db\vDimTestCaseOverlay.874.dim.xml”的元数据对象时出错. 二.解决问题-数据库 然后我手动尝试将“C:\Program Files\Microso

浅谈iOS开发中的对象归档

iOS提供的数据持久化方式有:SQLiteCoreData属性列表.NSUserDefault对象归档. 这里来简单介绍下iOS开发中的对象归档: 对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化)使用的时候读取该文件的保存路径读取文件的内容(也称为接档,反序列化) 对象归档的文件是保密的磁盘上无法查看文件中的内容,而属性列表是明文的可以查看) 对象归档有两种方式:1.对foundat中对象进行归档     2.自定义对象归档 1.简单对象归档 使用两个类:NSKeyedA r

记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)

目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: 1 ProcessStartInfo psi = new ProcessStartInfo(); 2 psi.FileName = "ProcessChild.exe"; 3 psi.Arguments = txtArgs.Text; 4 Process.Start(psi);//主要问题在这里 子进程的主程序: 1 txtArgs.Text = Process.GetCurrent

[oc第四天]【掌握】03-self用在对象方法中

[掌握]03-self用在对象方法中 self 指代的是调用当前对象方法的那个对象 过一遍代码就懂来 [掌握]04-self用在类方法中 [p class]返回的实质就是当前类(类对象) [self run] [了解] 05-self修饰变量 self->speed = speed; 如果同名,局部变量会暂时屏蔽全局变量的作用域 int a = 10; a = a; self->speed访问的是实例变量 加上self后表示访问的就是类的实例变量 不加self访问的局部变量 [掌握]08-继承

IOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer)模拟器应用沙盒的根路径在: (apple是用户名, 8.0是模拟器版本)/Users/apple/Libra

ClientDataSet中的错误处理

当修改数据发生错误时会先触发DataSetProvider.OnUpdateError事件处理过程然后触发ClientDataSet.OnReconcileError事件处理过程. OnUpDateError原型: procedure OnUpdateError( Sender: TObject;//触发此事件的对象 DataSet: TCustomClientDataSet; //产生错误的数据集 E: EUpdateError; //生成的错误对象 UpdateKind: TUpdateKi

iOS开发中xcode错误和异常处理

在开始这个的内容之前,我想先阐明两个在很多时候被混淆的概念,那就是异常 (exception) 和错误 (error). 在 Objective-C 开发中,异常往往是由程序员的错误导致的 app 无法继续运行,比如我们向一个无法响应某个消息的 NSObject 对象发送了这个消息,会得到 NSInvalidArgumentException 的异常,并告诉我们 "unrecognized selector sent to instance":比如我们使用一个超过数组元素数量的下标来试

记一次Nancy 框架中遇到的坑

记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上.搞了两天,终于解决了.于是把它记录下来,以避免其他人也碰到这种情况. 起因 公司一个Nancy 框架 开发的web网站,以前一直都是好的,nancy 框架也用在了很多项目里面,基本上已经很成熟很稳定了,但是在前几天发布某个web网站的时候,竟然出现部分用户登录不上的情况.刚开始以为是人员的权限有问

PHP中的错误处理、异常处理机制详解

在编写PHP程序时,错误处理是一个重要的部分.如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 ?> 那么正确的写法应该如下: <?php if (file_exists('test.txt')) { $f = fopen('test.txt', 'r'); // 使用完后关闭 fclose($f); } ?> 一.PHP错误