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. SQLite 数据库调研

    SQLite数据库的特点(转载的): ★技术上的优点和特性 SQLite是一个轻量级.跨平台的关系型数据库.既然号称关系型数据库,支持SQL92标准中常用的玩意儿(比如视图.事务.触发器等)就是理所当 ...

  2. .net实现微信公众账号接口开发

    说起微信公众帐号,大家都不会陌生,使用这个平台能给网站或系统增加一个新亮点,直接进入正题吧,在使用之前一定要仔细阅读官方API文档. API文档地址:http://mp.weixin.qq.com/w ...

  3. HPC Linux

    HPC也就是高性能计算,网格计算.服务器集群等前些日子听了Dr. Allen D. Malony讲座结束时得到两张光盘:一个HPC Linux的live cd,一个virtual box的ova镜像文 ...

  4. ubuntu安装python一些安装包

    sudo apt-get install python-pip sudo pip install distribute sudo pip install nose sudo pip install v ...

  5. Unity手游之路<八>自动寻路Navmesh之入门

    http://blog.csdn.net/janeky/article/details/17457533 在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能会 ...

  6. 4.了解AngularJS模块和依赖注入

    1.模块和依赖注入概述 1.了解模块 AngularJS模块是一种容器,把代码隔离并组织成简洁,整齐,可复用的块. 模块本身不提供直接的功能:包含其他提供功能的对象的实例:控制器,过滤器,服务,动画 ...

  7. linux回收站设计

    linux回收站设计 在windows下有一个很好的东西,那就是回收站,虽然有很多人批评它.linux不是没有回收站,很多桌面环境都可以看到是有回收站的. 这里是讨论如何设计一个回收站,而不是有没有的 ...

  8. IO复用与select函数

    socket select函数的详细讲解 select函数详细用法解析      http://blog.chinaunix.net/uid-21411227-id-1826874.html linu ...

  9. WebViewer报错Error loading document: Invalid XOD file: Zip end header data is wrong size!

    错误:Error loading document: Invalid XOD file: Zip end header data is wrong size! 解决:https://groups.go ...

  10. cxGrid的使用方法

    来源 http://www.cnblogs.com/djcsch2001/archive/2010/07/19/1780573.html   1.  去掉GroupBy栏 cxGrid1DBTable ...