将一个或多个OC对象写入文件/从文件读出

2024-08-28 16:38

本文主要是介绍将一个或多个OC对象写入文件/从文件读出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  利用NSCoding协议中的编码和解码方法进行实现对象实例的文件存储
1、过程描述:先将即将写入文件的类遵守NSCoping协议,然后在它的.m文件中添加协议中的
-(void)encodeWithCoder:(NSCoder *) aCoder编码方法和-(id)initWithCoder: (NSCoder *)aDecoder解码方法,在实现这些前提之后,就可以调用NSKeyedArchiver的archiveRootObject:(NSString *) toFile方法把对象写进指定的文件;或者调用NSKeyedUnarchiver的unarchiveObjectWithFile方法把对象从指定的文件中取出来.。
2、将一个对象存入文件所用方法剖析:
(1)编码方法。
实现NSCopying协议中的-(void)encodeWithCoder:(NSCoder *)aCoder方法,而NSCoder这个类提供了很多将各种数据类型写进文件的方法,而最常用最通用的方法是先把每个不是对象类型的成员变量通过NSNumber类或NSNumber对象的一些方法例如- (id)initWithChar:(char)value;  + (NSNumber *)numberWithInt:(int)value;  
+ (NSNumber *)numberWithDouble:(double)value;等转换为对象类型,并用aCoder调用NSCoder类的一个对象方法:- (void)encodeObject:(id)objv forKey:(NSString *)key;为每一个成员对象或封装后的成员对象分别提供一个唯一的字符串即键,一一进行编码。
(2)解码方法。实现NSCopying协议中的-(id)initWithCoder: (NSCoder *)aDecoder这个解码方法,它相当于一个初始化方法,所以要有if(self=[super init]){ // 具体实现 }语句,并且要在最后返回自身即最后添加 return self;语句。在实现语句中要用aDecoder调用NSCoder的对象方法- (id)decodeObjectForKey:(NSString *)key; 根据自己添加的键返回对应的成员对象或封装基本类型的对象。如果为封装基本数据成员类型的对象还要调用NSNumber类的一些方法如

- (char)charValue;  - (double)doubleValue;  - (int)intValue;等把自己封装的基本数据给提取出来。然后把这些对象和提取出来的数据一一赋给对应的成员变量,注意:如果对非封装基本数据类型的一些成员对象设置了retain或copy属性或以手动提供了这两种形式的set/get方法的话,在把从文件解码出来的数据(对象,基本类型)赋给这些对象成员时要调用提供的set方法进行赋值即"self.成员对象=解码出得对应对象"。就可以对对象数据进行解码提取了。            

(3)将对象写入文件的方法。利用NSKeyedArchiver类的如下类方法:
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path; 将创建好初始化过的对象写到指定的文件中,如果写入成功则返回YES,否则返回NO。
(4)从文件提取对象的方法。利用NSKeyedUnarchiver类的类方法:
+ (id)unarchiveObjectWithFile:(NSString *)path;从指定的文件读取数据赋值给一个新声明的对象名即可。

3、将多个对象存入同一个文件

(1)方式一   新建一个字典对象,为每个对象提供一个唯一的键存入这个字典对象。然后把这个字典对象利用NSKeyedArchiver类的类方法archiveRootObject:,,,toFile,,,方法写进指定的文件即可,从文件读取字典与从文件读取对象步骤相同,因为字典对象也是一个对象。具体步骤上同。

(2)方式二  新建一个NSArray数组对象,同时把多个对象存入数组。然后把数组存入指定的文件即可,从文件读取多个对象其实就是从文件读取一个存放多个对象的数组对象。具体步骤全都一样。

(3)注意事项:数组可以用快速遍历一次显示多个读出对象的内容。但字典不可以用快速遍历,但是可以用枚举进行迭代,过程如下:新建一个枚举迭代器 要利用字典对象调用它的一个对象方法objectEnumerator创建一个NSEnumerator对象假设为em,即NSEnumerator *em=[dictionary objectEnumerator]; 在用while循环结构对迭代器的

nextObject方法进行循环调用即可实现迭代。即 id temp;  while(temp=[em nextObject]){

 // 调用输出成员的方法或已经重写的description方法或者直接打印对象的成员变量值

}

4、获取系统根路径的方法:直接调用NSHomeDirectory方法即可即  NSHomeDirectory( );

5、切记:谁的事情由谁来做。主要体现如下几个方面,举例如下:

(1&

这篇关于将一个或多个OC对象写入文件/从文件读出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

Android/Linux 磁盘写入缓存/等待时间 参数修改

Linux系统当进行文件写操作时,并不会将数据立马写入磁盘,而是写写到缓存,等待达到占用内存一定比例或超过一定时间才会批量将这些缓存数据写入磁盘,这样可以减少IO操作,提升性能和磁盘寿命。如果数据还没来得及写入磁盘发生硬件掉电,这些数据就会丢失。应用可以调用sync实时将内容写入磁盘避免丢失。排查丢失问题可以在断电前执行sync命令,看能不能复现,若无法复现,说明就是缓存没有及时写入磁盘导致。

C# 如何同时Ping多个IP地址

在C#中,如果需要同时ping多个IP地址,可以采用多线程或异步编程的方式来实现,以便可以同时进行多个ping操作。以下是两种常用的方法: 方法一:使用多线程(Task 或 Thread) 使用Task是更现代和推荐的方式,因为它内置了更好的线程管理和异常处理机制。以下是一个使用Task的示例,展示如何同时ping多个IP地址: using System; using System.Co