ios 什么是初始化编码器和解码器?

woobm2wo  于 2023-03-14  发布在  iOS
关注(0)|答案(3)|浏览(258)

我正在学习iOS开发的在线课程,每次我创建一个自定义视图(自定义表视图单元格,集合视图单元格等),讲师总是实现这个初始化器:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

为什么我总是要调用这个函数?它有什么作用?我能把属性放在init里面吗?

ia2d9nvy

ia2d9nvy1#

我将从相反的方向开始回答这个问题:如果你想把视图的状态保存到磁盘上怎么办?2这被称为序列化。3相反的是反序列化--从磁盘上恢复对象的状态。
NSCoding协议定义了两种方法来序列化和反序列化对象:

encodeWithCoder(_ aCoder: NSCoder) {
    // Serialize your object here
}

init(coder aDecoder: NSCoder) {
    // Deserialize your object here
}

那么为什么在你的定制类中需要它呢?答案是接口构建器。当你把一个对象拖到情节串连图板上并配置它时,接口构建器序列化该对象的状态到磁盘上,然后当情节串连图板出现在屏幕上时反序列化它。你需要告诉接口构建器如何做这些。至少,如果你不向你的子类添加任何新属性,你可以简单地请求超类为你打包和解包,因此调用super.init(coder: aDecoder)。2如果你的子类更复杂,你需要为子类添加你自己的序列化和反序列化代码。
这与Visual Studio的方法相反,Visual Studio的方法是将代码写入隐藏文件以在运行时生成对象。

5ktev3wc

5ktev3wc2#

实现该初始化器的要求是两件事的结果:
1.如果S是T的子类(例如MyViewControllerViewController的子类),则S个对象(MyViewController的示例)必须能够被替换到期望T个对象(ViewController的示例)的地方。
1.如果在子类中显式定义了初始化器,那么在Swift中初始化器不会被继承。如果显式提供了一个初始化器,那么所有其他的初始化器也必须显式提供(然后可以调用super.init(...))。基本原理请参见this question。它在Java中,但仍然适用。
到了第一点,ViewController可以做的所有事情,MyViewController子类都应该可以做。其中一件事就是能够从给定的NSCoder初始化。到了第二点,MyViewController子类不会自动继承这个能力。因此,必须手动提供满足这个要求的初始化器。在这种情况下,你只需要委托给超类,让它做它通常会做的事情。

2mbi3lxu

2mbi3lxu3#

当您创建UIView的自定义子类并在故事板或笔尖文件中使用它时,Xcode会自动生成一个表示故事板或笔尖文件内容的XML文件。当您的应用运行时,将读取该XML文件并使用NSCoder协议对编码对象进行解码。

相关问题