首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在自定义类上使用NSCoding时,在self.init调用错误之前使用的“‘self”

在自定义类上使用NSCoding时,在self.init调用错误之前使用的“self”是指当前对象的引用,用于访问当前对象的属性和方法。

NSCoding是Objective-C中用于实现对象的序列化和反序列化的协议。当我们需要将自定义类的对象进行归档(序列化)或者解档(反序列化)时,需要实现NSCoding协议中的两个方法:encode(with:)和init(coder:)。

在encode(with:)方法中,我们可以使用self来访问当前对象的属性,并将其编码为二进制数据。例如,可以使用self.propertyName来访问当前对象的属性。

在init(coder:)方法中,我们同样可以使用self来访问当前对象的属性,并将解码后的数据赋值给这些属性。例如,可以使用self.propertyName = aDecoder.decodeObject(forKey: "key") as? PropertyType来将解码后的数据赋值给当前对象的属性。

需要注意的是,在init(coder:)方法中,我们需要先调用父类的init(coder:)方法,然后再使用self来访问当前对象的属性。这是因为在初始化过程中,需要先确保父类的初始化完成,才能访问当前对象的属性。

以下是一个示例代码,演示了在自定义类上使用NSCoding时如何使用self:

代码语言:swift
复制
class CustomClass: NSObject, NSCoding {
    var property1: String
    var property2: Int
    
    init(property1: String, property2: Int) {
        self.property1 = property1
        self.property2 = property2
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(property1, forKey: "property1")
        aCoder.encode(property2, forKey: "property2")
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
        self.property1 = aDecoder.decodeObject(forKey: "property1") as? String ?? ""
        self.property2 = aDecoder.decodeInteger(forKey: "property2")
    }
}

在上述示例代码中,我们在encode(with:)方法和init(coder:)方法中都使用了self来访问当前对象的属性。在encode(with:)方法中,我们将属性编码为二进制数据;在init(coder:)方法中,我们将解码后的数据赋值给属性。

对于这个问题,由于没有具体的上下文和代码示例,无法给出更加详细和具体的答案。希望以上信息对您有所帮助。如果您有任何进一步的问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 关于使用MethodHandle子类中调用祖父重写方法探究

    关于使用MethodHandle子类中调用祖父重写方法探究 注:这个例子原本出现在周志明先生《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...这里直接看Sonthinking方法(关于为何这样实现,《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)中也解释了)。...普通方法调用中,这个this参数是虚拟机自动处理,表示是当前实例对象,我们方法中可以直接使用。...基于这个事实,我们这时可以直接在GrandFatherthinking方法中调用Son独有的方法,使用反射或者直接类型强制转换为Son就行了。...())。

    9.5K30

    Android开发使用自定义View将圆角矩形绘制Canvas方法

    本文实例讲述了Android开发使用自定义View将圆角矩形绘制Canvas方法。...分享给大家供大家参考,具体如下: 前几天,公司一个项目中,头像图片需要添加圆角,这样UI效果会更好看,于是写了一个小demo进行圆角定义,该处主要是使用BitmapShader进行了渲染(如果要将一张图片裁剪成椭圆或圆形显示屏幕...BitmapShader完成渲染图片基本步骤如下: 1、创建BitmapShader对象 /** * Call this to create a new shader that will...MIRROR:使用镜像方式 REPEAT:使用重复方式 2、通过PaintsetShader(bitmapShafer)来设置画笔 3、使用已经setShader(bitmapShafer)画笔来绘制图形...下面展示绘制圆角图片demo 1、自定义RounderCornerImageView.java package com.example.test; import android.content.Context

    2.4K30

    NSCopying和NSCoding对象序列化反序列化基础详解你要知道NSCopying、NSCoding协议及对象序列化和反序列化都在这里

    ,直接使用原对象即可,如果原对象运行时类型是可变使用copy以后获取是一个全新对象,这样就可以避免多态错误。...NSCoding协议与对象序列化和反序列化 开发中可能需要将自定义对象持久化存储本地文件中,或将对象转换为NSData数据并通过网络发送,要实现这些操作前提就是自定义对象需要遵守NSCoding...协议,NSCoding协议是对象序列化和反序列化基础,NSCoding协议只定义了两个方法: /*将对象编码 序列化对象时调用该方法,该方法中序列化对象每一个属性 一般使用encodeObject...协议,因此调用init构造方法 如果继承遵守NSCoding协议需要调用initWithCoder:方法 [super initWithCoder:aDecoder...关于NSCoding协议使用是比较简单,需要注意就是initWithCoder:方法中调用构造函数方式。 备注 由于作者水平有限,难免出现纰漏,如有问题还请不吝赐教。

    1.4K90

    iOS开发——数据持久化之归档

    而昨天我实际工作中,有一个数组NSMutableArray需要存储,但是使用时,报了一个错误 reason: '*** -[NSUserDefaults setObject:forKey:]: attempt...那么对自定义对象归档显得重要多,因为很多时候我们都要在程序退出保存数据,再程序恢复重新加载,那么,归档便是一个好选择。 接下来我们来讲讲NSKeyedArchiver使用。...要使对象可以归档,对象必须实现NSCoding协议,大部分对象都符合NSCoding协议,一般我们可以我们Model中实现NSCoding协议。...]; copy.version = [self.version copyWithZone:zone]; return copy; } 特别注意 如果需要归档是某个自定义子类,...就需要在归档和解档之前先实现父归档和解档方法。

    61510

    iOS学习——iOS常用存储方式

    读取使用arrayWithContentsOfFile:方法 2.2 preference(偏好设置) preefrence(偏好设置)顾名思义就是用户使用过程中对App一些状态和自定义设置状态保存...一般对于一些基本用户设置,因为数据量很小,我们可以使用OC语言中NSUserDefaults来进行处理。使用方法很简单,只需要调用方法即可。...:self.age forKey:@"age"]; 15 }  特别注意 如果需要归档是某个自定义子类,就需要在归档和解档之前先实现父归档和解档方法。...注意 必须遵循并实现NSCoding协议 保存文件扩展名可以任意指定 继承必须先调用归档解档方法 扩展:iOS开发基础-数据存储方式(归档) 2.4 手动存放沙盒 手动将数据存放到沙盒...再次访问这些数据就会发生错误

    3K100

    如何使用OnionJugglerUnix系统通过命令行管理你Onion服务

    关于OnionJuggler OnionJuggler是一款功能丰富Onion服务管理工具,适用于Unix操作系统。...该工具使用POSIX兼容Shell脚本进行编写,可以帮助广大研究人员Unix系统通过命令行管理自己Onion服务。...3、分发,从源代码级别(FOSS)到允许任何人在任何操作系统、shell或服务管理器运行代码所产生效果。...或tor用户调用命令 所需组件 sh doas/sudo tor >= 0.3.5.7 grep >=0.9 sed tar Openssl basez git python(3)-stem >=1.8.0...如需修改变量值,可以按照下列步骤操作: 使用编辑器打开上述配置文件: "${EDITOR:-vi}" /etc/onionjuggler/cond.d/local.conf 或者使用tee结尾插入下列配置内容

    79320

    Swift 构造器使用

    self.init 应该就好了....如下图所示: 图中, 只有指定构造器才可以调用指定构造器, 而便利构造器是不可以, 这也遵循了我们之前所说三条规则. 只要 init 方法遵循这三个规则就不会有任何问题....构造器第一阶段构造完成之前, 不能调用任何实例方法, 不能读取任何实例属性值,self 不能被引用. 接下来我们来说明一下构造两个阶段: 阶段 1 某个指定构造器或便利构造器被调用....所以我们让这个便利构造器调用同一个 self.init(style: UITableViewCellStyle, reuseIdentifier: String?) 指定构造器....构造器第一阶段构造完成之前, 不能调用任何实例方法, 不能读取任何实例属性值,self 不能被引用. 继承相关 如果子类没有定义任何指定构造器, 那么会默认继承所有来自父指定构造器.

    1.7K20

    一日一技:使用 Git 错误分支修改了代码怎么办?

    我们知道,使用 Git 时候,应该要正确使用分支(Branch)功能。不同功能使用不同分支开发,最后合并进入主分支。但有时候会出现这样一种情况——我代码都已经写完了,才发现我写错分支了。...这个时候,怎么把我修改迁移到目标分支,并且不修改现在正在使用分支? 我们用一个简单例子来说明这种情况。...于是直接修改了dev 分支1.txt: ?...很多人可能会这样做:打开一个记事本,把1.txt 里面修改内容记录下来。然后使用命令git checkout -- 1.txt恢复1.txt 到修改之前内容。然后切换到 master 分支。...可以看到,刚才修改已经自动应用到了master 分支1.txt 上面了。 git stash会把当前修改内容缓存起来,并恢复当前工作区到你修改之前状态。

    98920

    swift 构造器

    构造器 使用构造器来实现构造过程,构造器可以看做是用来创建新实例特殊方法,与OC构造器不同,之前是先调用init再写自己, 但是到了Swift里面, 我们却先初始化自己, 再初始化父, 是相反...,swift中构造器无需返回值,主要任务是保证新实例第一次使用前完成正确初始化 为存储属性赋初始化值 和结构体创建实例,必须为所有存储类型设置初始值 可以构造器中设置, 也可以声明属性时候就给定...则会有从父继承构造器情况要考虑, 不过还是那句话, 所有存储属性构造器中都完成初始化就可以. 对于值类型,你可以使用self.init自定义构造器中引用相同类型中其它构造器。...初始化有两阶段 第一阶段,每个存储属性分配一个初始值 第二阶段,每个实例在被使用之前进一步定义其存储属性 第一阶段 • 某个指定构造器或便利构造器被调用 • 完成新实例内存分配,...4.构造器第一阶段构造完成之前,不能调用任何实例方法,不能读取任何实例属性值,不能引用self作为一个值 构造器继承和重写 跟 OC 中子类不同,Swift 中子类默认情况下不会继承父构造器

    18110

    VS2010使用C#调用非托管C++生成DLL文件(图文讲解) 背景

    背景      项目过程中,有时候你需要调用非C#编写DLL文件,尤其使用一些第三方通讯组件时候,通过C#来开发应用软件,就需要利用DllImport特性进行方法调用。...它是静态链接时或动态链接时调用LoadLibrary和FreeLibrary都会被调用。...extern "C" __declspec(dllexport)加起来目的是为了使用DllImport调用非托管C++DLL文件。因为使用DllImport只能调用由C语言函数做成DLL。...CSharpInvokeCSharp.CSharpDemo项目新建一个CPPDLL,编写以下代码: public class CPPDLL { [DllImport("CSharpInvokeCPP.CPPDemo.dll...方法得到调用。  10. 以上方法只能通过静态方法对于C++中函数进行调用。那么怎样通过静态方法去调用C++中一个对象中方法呢?

    2.8K50

    「死磕」Core Data——非标准数据类型保存

    一篇写了Core Data入门,这篇会涉及两部分内容: NSFetchedResultsController使用。 非标准数据类型保存。...NSFetchedResultsController使用 其实这个名字,会引起一定歧义,光看名字,以为是一个普通视图控制器,其实它并不继承自UIViewController。...这个,仅用于高效地管理从Core Data中取回数据,供UITableView使用,也就是作为UITableView数据源而存在。...可能是UITableViewiOS开发中太常用了,所以专门造了这个,和UITableView搭配使用。...然后声明属性类型时候,使用NSValue类型,如@property (nullable, nonatomic, retain) NSValue *imgeRect; 赋值,进行转化,如下: newUser.imgeRect

    1K60

    iOS进阶之runtime作用

    2、作用 1.动态交换两个方法实现 2.为类别添加属性(我们知道类别是不能扩展属性,只能扩展方法,但可以运行时实现,通过为增加属性) 3.获取某个所有成员变量和成员方法 4.实现NSCoding...3、详解: 一、动态交换方法 1.自定义DWExchangeTwoMethod.m中 - (instancetype)init { if (self = [super init]) {...play]; 由可以看出,调用是play方法 但打印结果为 【玩...】...(@property申明属性),而class_copyIvarList返回所有属性和变量(包括@interface大括号中声明变量) 四、实现NSCoding自动归档和自动解档; (不用对每个属性...]; } free(ivars); c = [c superclass]; } } @end 这时,可以DWPerson.m中取代之前代码

    63790

    iOS应用数据存储(数据持久化)常用方式一、iOS数据持久化方式二、应用沙盒(应用程序文件夹)三、使用方法

    ,例如:游戏进度、涂鸦软件绘图 目录中文件会被自动保存在 iCloud 注意:不要保存从网络上下载文件,否则会无法架!...路径获取: 通过NSUserDefaults存取该目录下设置信息 ---- 三、使用方法 1、属性列表 属性列表是一种XML格式文件,拓展名为plist,如果对象是NSString、NSDictionary...(1)遵守NSCoding协议,实现协议方法 NSCoding协议中两个方法,一般写在模型中: 归档调用 一般在这个方法里面指定如何归档对象中每个实例变量,可以使用encodeObject:forKey...,storyboard都是文件,因此只要解析这两个文件,就会调用initWithCoder,因此如果在storyboard使用自定义view,重写initWithCoder方法,一定要调用[super...NSCoding协议,应该在encodeWithCoder:方法中加上一句[super encodeWithCode:encode];确保继承实例变量也能被编码,即也能被归档 (2)initWithCoder

    2.6K70

    Swift学习:构造器(

    Swift赋予自定义类型更加丰富功能,一个显著地方就是构造过程。Swift可以为自定义类型设置构造器来初始化一个实例。有关Swift构造器使用特点可以总结如下: 构造器适用于、结构体、枚举。...是新实例可用之前必须执行一个过程 构造器具体操作包括:必须保证所有存储型属性有合适初始值,执行其他必须设置 构造器无需返回值,区别于OC 实例可以定义析构器,实例释放之前执行特定清除工作...//构造函数必须保证所有值可用,此处赋值操作必须有 } } 四、可选型属性构造器中使用 使用可选型是因为在业务逻辑允许此属性为nil,包括两种情况如下: 1.初始化时候无法为其赋值...构造器通过调用其他构造器来完成实例部分构造,被称为构造器代理,实现减少代码重复,构造器代理分为两种: 值类型构造器代理:适用于值类型(结构体/枚举),没有继承等复杂过程,较为简单 构造器代理:...因为有涉及到继承,需要保证所有继承属性也能正确初始化(也即是便利构造器,见下篇) 对于值类型,可以自定义构造器中使用self.init调用其他构造器 如果值类型定义了自定义构造器将不能使用默认构造器和逐一成员构造器

    87870

    Swift3.0 - 初始化和释放

    ,初始化没有默认值非可选存储属性 5.结构体系统默认会添加初始化方法,当然自己也可以自定义 6.子类如果没有自己初始化方法,系统默认使用初始化方法,一旦有了自己初始化方法,或者重写了父初始化方法...: 1.同一个,使用convenience修饰初始化方法必须调用一个其他初始化方法 2.convenience 必须最终调用一个指定初始化方法 3.当子类继承父,子类初始化方法,必须调用指定初始化方法...,不能调用使用convienience修饰方便初始化方法 4.swift3.0 初始化中,可以自己调用自己初始化方法,系统不会检测出来,创建convenience方便初始化方法时候,需要小心...4.然后去调用指定初始化方法,任务和调用自己指定初始化方法相同 5.继续继承链中指定上述过程,直到达到链顶部为止 6.当到完成基初始化时候,实例初始化算是完成了,我们第一阶段完成...} } 对于可能出现空值对象或者其他类型,使用之前必须进行验证 enum TemperatureUnit: Character { case kelvin = "K", celsius = "C",

    55210
    领券