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. SQL双重游标(双重循环)--笔记

    declare )='', )='', )='' --创建游标 declare @cursor cursor --设定游标欲操作的数据集 set @cursor=cursor for select s ...

  2. K-V-O 键值观察机制

    在两个不同的控制器之间传值是iOS开发中常有的情况,应对这种情况呢,有多种的应对办法.kvc就是其中的一种,所以,我们就在此解释之.   key value observing  键值观察,给人一种高 ...

  3. iOS 简单音乐播放器 界面搭建

    如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间 ...

  4. Unable to add window -- token null is not for an application

    导致报这个错是在于new AlertDialog.Builder(mcontext),虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApp ...

  5. Android权限 uses-permission

    Manifest.permission 官方API说明: http://developer.android.com/reference/android/Manifest.permission.html ...

  6. Ubuntu编译源码程序依赖查找方法

    ubuntu平时编译源码程序的时候会提示缺少相关的库或是头文件,可以按照以下两种方法进行查找,然后再安装相应的软件包. 1.使用apt-file查找头文件 安装apt-file sudo apt-ge ...

  7. 10. JEB1.5 插件编写二

    一些实例 1. 遍历当前光标处函数所有的Element Java代码: import java.io.*; import java.util.List; import jeb.api.IScript; ...

  8. C# 复制(深拷贝、浅拷贝)

    Object.MemberwiseClone 方法 创建当前 Object 的浅表副本. protected Object MemberwiseClone() MemberwiseClone 方法创建 ...

  9. Nunit-Writing Tests

    Nunit 测试可以被任意支持attributes的.net语言使用 Attributes被用于去标识测试类和测试方法,然后通过不同的方式修改他们的行为 Assertions针对一个或多个约束,测试一 ...

  10. 《oracle每天一练》Merge Into 语句代替Insert/Update在Oracle中的应用实战

    转载自窃破天道 动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也 ...