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. Redis学习笔记七:独立功能之排序

    sort 命令可以对列表键.集合键或有序集合键的值进行排序.sort 命令并不修改数据库值,只是输出有序. 127.0.0.1:6379> rpush numbers 9 8 7 6 1 2 3 ...

  2. FadeTop – 定时休息提醒工具

    FadeTop 是款定时休息提醒工具,其特色是当设定时间到达时,将桌面渐变为指定的颜色,强制提醒但不影响桌面的任何操作 FadeTop is a visual break reminder for W ...

  3. BZOJ2599——[IOI2011]Race

    0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的 ...

  4. 一起入门python5之for循环

    昨天中午本来写了的,结果手贱了一下ctrl+x以后又去复制了别的东西.结果所有写的都没有了.蛋疼.继续写吧.今天来说for循环即条件判断>>> age = 20        #首先 ...

  5. 剑指Offer 把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...

  6. POJ 3641 快速幂+素数

    http://poj.org/problem?id=3641 练手用,结果念题不清,以为是奇偶数WA了一发 #include<iostream> #include<cstdio> ...

  7. js判断移动端是否安装某款app的多种方法

    本文实例讲解了js判断移动端是否安装某款app的多种方法,分享给大家供大家参考,具体内容如下 第一种方法: 一:判断是那种设备 ? || u.indexOf(; //android终端或者uc浏览器 ...

  8. linux下合并两个文件夹

    一.我想把自己自定义的软件统一放到man手册路径里.如何和现有的/usr/local/share文件夹合并起来,原来的文件还在? (1)下面是解压出的自定义的bashdb调试软件==>

  9. 获取编辑框字符串,传入Intent

    private EditText etData; etData = (EditText) findViewById(R.id.etData); Intent i = new Intent(MainAc ...

  10. Majority Number I & || && |||

    Majority Number Given an array of integers, the majority number is the number that occurs more than ...