Ps:苹果官方文档-Initialization

自定义控件初始化中常见的几种错误(指定构造器和便利构造器)
截图:

 

意思是:
1.没有添加重写符override(重写父类方法)
2.没有重写initWithCoder方法。(此方法只对应初始化是从xib,执行代码只的是,未从xib初始化)

 

意思是:为初始化父类的init方法

 

意思是:必须代理初始化自己的方法

 

意思是:不认识此类型的Default

 

意思是:禁止调用此初始化方法

 

意思是:属性label没有在父类初始化方法调用之前初始化

看到这里是不是有种崩溃的心情,别着急,对于OC和Swift的初始化,苹果官方给了一些很合理的解释,请点开这里:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html

定义Swift初始化方法,必须遵循三条规则:
1.指定构造器必须调用它直接父类的指定构造器方法
2.便利构造器必须调用同一类中定义的其他初始化方法
3.便利构造器在最后必须调用一个指定构造器。
图形说明:

 

便利构造器 前面加convenience 指定构造器什么都不用加,系统初始化方法 要加override

还需要注意的是:

和OC一样,未初始化时,属性是不被赋值的,因为其内存空间不存在

从这里我们来看Swift是怎么进行初始化的:

1.第一阶段,是实例的所有属性被初始化
2.第二阶段,实例的所有属性可以再次的调整以备之后的使用

Swift的编译器会对初始化的方法进行安全地检查已保证实例的初始化可以被安全正确的执行:
1.指定构造器必须要确保所有被类中提到的属性在向上调用父类的指定构造器前被初始化,之后才能将其他构造任务移交给父类的中的构造器。
2.指定构造器必须先向上调用父类中的构造器,然后才能为任意属性赋值
3.遍历构造器必须线调用同一个类中的其他构造器,然后再为属性赋值
4.构造器在第一个阶段构造完成之前,不能调用其他任何实例方法,不能读取实例属性的值,self不能被引用

在这里解释初始化所谓的第一阶段:
初始化的第一个阶段:
1.某个指定构造器或便利构造器被调用
2.完成新的实例内存的分配,但此时内存还没有被初始化
3.指定构造器确保其所在类引入的所有存储型属性都已赋值。存储型属性所属的内存完成初始化。
4.指定构造器将调用父类的构造器,完成父类属性的初始化
5.这个调用父类构造器的过程沿着构造器链条一直往上执行,直到到达构造器料条的最顶部(重复1—4步骤)
6.当到达了构造器链条的最顶部,且已确保所有实例包含的存储型属性都已经赋值。这个实例的内存才会被认为已经完全初始化了

 

注意:
1。子类的便利构造器首先会被调用,此时便利构造器还不能修改子类的任何属性。
2.便利构造器会调用子类中的指定构造器,指定构造器(子类)要确保所有的属性都已赋值,完成所属内存的初始化
3.接着会指定构造器(子类)会调用父类中的指定构造器,完成父类属性所属内存的初始化,直到达到构造器链条的最顶部,所有的属性以及内存被完全初始化,然后进入第二阶段

 

便利构造器内存未被初始化,不能修改属性

第二阶段:

1.从顶部构造器沿着链条一直向下,每个构造器链条中类的指定构造器都有机会一步定制实例。构造器此时可以访问self,修改它的属性并调用实例方法等等
2.最终,任意构造器链条中的便利构造器可以有机会定制实例和使用self

创建的错误注意点:

1.如果子类没有定义任何指定构造器,那么会默认继承所有来自父类的指定构造器

2.指定构造器必须调用它最近父类的指定构造器‘

3.便利构造器必须调用同一个类中定义的其他构造器(指定或便利都可以)

4.如果子类未定义任何指定构造器,那么会默认继承所有来自父类的指定构造器

5.指定构造器必须要确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化,之后才能将其他构造任务交给父类的构造器

Snip20151211_17.png

Swift - 初始化Initialization的更多相关文章

  1. swift初始化

    swift初始化 class INIT: NSObject { // 一个结构体的初始化 // 1.存储属性的初始化 struct Fahrenheit { var temperature :Doub ...

  2. swift 初始化

    知识点总结: 1.结构体 1.1.默认初始化方法:1.空初始化方法:2.成员初始化方法 struct Person{ var name = "tom" var age = } le ...

  3. [swift]初始化方法自己主动继承

    子类默认不会继承父类的初始化方法,然而,假设某种条件满足的话.父类的初始化方法还是能够继承给子类.在通常情况下,这意味着你不必复写父类的初始化方法.在安全的前提下能够以最低的代价继承父类的初始化方法. ...

  4. Swift - 初始化方法返回nil表示初始化失败

    自Swift1.1开始,初始化init方法便有返回nil的能力.我们可以在init声明的时候在其后面加上一个 ? 或者 ! 来表示初始化失败时可能返回nil. 比如,给Int类添加一个将字符串初始化成 ...

  5. Swift初始化空字符串

    为了构造一个很长的字符串,可以创建一个空字符串作为初始值.可以将空的字符串字面量赋值给变量,也可以初始化一个新的String 实例: var emptyString = "" // ...

  6. Swift从入门到精通第十一篇 - 初始化 初识

    初始化(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 初始化 初始化是类.结构体.枚举生成实例的过程,为该类的每个存储属性设置初始值,有些在实例使用前的设置或初始化也可在此实现 ...

  7. Swift的初始化方法

    我们在深入初始化方法之前,不妨先再想想Swift中的初始化想要达到一种怎样的目的. 其实就是安全.在Objective-C中,init方法是非常不安全的:没有人能保证init只被调用一次,也没有人保证 ...

  8. Objective -C Object initialization 对象初始化

    Objective -C Object initialization 对象初始化 1.1 Allocating Objects  分配对象 Allocation is the process by w ...

  9. Swift 笔记汇总

    Swift 3 笔记 Swift: The Basics :介绍 Swift 一些零碎的点. Swift: Basic Operators :介绍 Swift 的操作符. Functions : 介绍 ...

随机推荐

  1. DateEdit和TimeEdit用法

    DateEdit 控件默认情况下,显示的只有日期,没有时间.下面介绍2中日期和时间同时显示的方法: 1.Properties.VistaDisplayMode 为true, 2.Properties. ...

  2. mysql:You can't specify target table 'bpm_tksign_data' for update in FROM clause

    UPDATE bpm_tksign_data WHERE actinstid ' AND nodeid = 'SignTask1' AND batch = ( SELECT max(a.batch) ...

  3. AutoHotkey之自问自答

    偶然的机会,接触到了AutoHotkey这个东西,觉得不错,便花时间了解了一下.以此来记录我在学习AutoHotkey时遇到的各种问题,以及我对其的解释(有可能不专业甚至出错). Time:2015- ...

  4. hibernate 学习知识总结

    1.最近用hibernate 学会很多知识,总结如下: (1)数据库表格已经设置默认值,在进行数据插入的时候,bean里面不赋值的话,插入之后该字段依旧是null 是因为hibernate默认插入和更 ...

  5. Struts2 Action 动态传参数

    Struts2的两个Action之间传参的问题. 需求功能是这样:Action1 获取数据库配置内容,得到相应Model的 动态URL ,这里的URL 有的是Action有的是JSP页面. 1.使用r ...

  6. BZOJ 1419: Red is good

    Sol 期望DP. \(f[i][j]\) 表示剩下 \(i\) 张红牌, \(j\) 张黑牌的期望. 有转移方程. \(f[i][j]=0,i=0\) 没有红色牌了,最优方案就是不再翻了. \(f[ ...

  7. 大数据热点问题TOP K

    1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...

  8. JVM(java 虚拟机)内存设置

    一.设置JVM内存设置 1. 设置JVM内存的参数有四个: -Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定: -Xms   Ja ...

  9. 1.4---字符串空格变成20%(CC150)

    import CtCILibrary.AssortedMethods; public class Question { // Assume string has sufficient free spa ...

  10. 《oracle每日一练》免安装Oracle客户端使用PL/SQL

    免安装Oracle客户端使用PL/SQL Oracle客户端挺招人烦的,部署连接它的应用通常需要先安装它的客户端,安装程序要求在目标机器上写注册表,假设你没有洁癖的话,你仍可能被下面的事情绊住:当你的 ...