首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

swift底层探索 01 - 类初始化&类结构swift底层探索 01 - 类初始化&类结构

探索路径同样是参考oc的探索路径,先从类开始。 类初始化 1. 使用Xcodel断点调试 ? 创建一个简单的类,开启汇编断点 ?...1步骤就是__allocation_init是swift对象初始化入口 通过2步骤可以进入下一步(下断点,按住control+↓) ?...swift_allocObject是初始化第二步 下断点,按住control+↓进入下一步 ? swift_slowAlloc是初始化第三步 下断点,按住control+↓进入下一步 ? ?...初始化流程图 ? 类结构 - HeapObject结构 1. 编译器断点 ? 在进行类创建,源码调试的时候发现swift的类结构是这样的。和oc比起来是有一些不同的。...只有kind有点不一致,其实也可以看做是isa,都是指向元类 元类结构图 ? swift类结构.png

87230

Swift基础 初始化

翻译自:https://docs.swift.org/swift-book/LanguageGuide/Initialization.html 初始化是准备类、结构或枚举实例以供使用的过程。...类继承和初始化 类的所有存储属性,包括该类从其超类继承的任何属性,在初始化期间必须分配初始值。 Swift为类类型定义了两种初始化器,以帮助确保所有存储的属性都收到初始值。...,Swift对初始化器之间的委托调用适用以下三项规则: 规则1 指定的初始化器必须从其直接超类调用指定的初始化器。...它说明了此层次结构中的指定初始化器如何充当类初始化的“漏斗”点,简化了链中类之间的相互关系: 两阶段初始化 Swift 中的类初始化是一个两阶段的过程。...初始化器继承和重写 与Objective-C中的子类不同,Swift子类默认不会继承其超类初始化器。

17600
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Swift 反初始化

    反初始化 在类实例被释放的时候,反初始化器就会立即被调用。你可以是用 deinit 关键字来写反初始化器,就如同写初始化器要用 init 关键字一样。反初始化器只在类类型中有效。...反初始化器原理 当实例不再被需要的时候 Swift会自动将其释放掉,以节省资源。如同自动引用计数中描述的那样,Swift 通过自动引用计数(ARC)来处理实例的内存管理。...比如说,如果你创建了一个自定义类来打开某文件写点数据进去,你就得在实例释放之前关闭这个文件。 每个类当中只能有一个反初始化器。...你不能自行调用反初始化器。父类的反初始化器可以被子类继承,并且子类的反初始化器实现结束之后父类的反初始化器会被调用。父类的反初始化器总会被调用,就算子类没有反初始化器。...应用反初始化器 这里有一个应用反初始化器的栗子。这里栗子给一个简单的游戏定义了两个新的类型, Bank和 Player。 Bank类用来管理虚拟货币,它在流通过程中永远都不能拥有超过10000金币。

    31110

    Swift入门:类

    Swift有另一种方法来构建称为类的复杂数据类型。它们看起来类似于结构体,但有许多重要的区别,包括: 您的类没有自动的成员初始化器;您需要编写自己的初始化器。...初始化对象 如果我们要将Person结构体转换为Person类,Swift不会让我们这样写: class Person { var clothes: String var shoes:...这在结构体中很好,因为Swift会自动为我们生成一个成员初始化器,强制我们为这两个属性提供值,但这不会在类中发生,因此Swift无法确定它们是否会被给定值。...重要提示:Swift要求所有非可选属性在初始化方法结束时或在初始化方法内调用任何其他方法时(以先到者为准)都有一个值。 类继承 类和结构体之间的第二个区别是类可以在其他类之上构建更大的东西,即类继承。...它还允许Swift检查你的代码:如果你不使用override Swift不允许你更改从你的超类得到的方法,或者如果你使用override而没有任何东西可以重写,Swift会指出你的错误。

    75410

    Swift基础 去初始化

    Swift基础 - 去初始化 翻译自:https://docs.swift.org/swift-book/LanguageGuide/Deinitialization.html 在类实例被释放之前,会立即调用去初始化器...您使用deinit关键字编写去初始化器,类似于使用init关键字编写初始化器的方式。取消初始化器仅适用于类类型。...例如,如果您创建一个自定义类来打开文件并向其写入一些数据,您可能需要在类实例被释放之前关闭文件。 类定义每个类最多可以有一个去初始化器。...您不得自己调用非初始化器。超类非初始化器由其子类继承,超类非初始化器在子类非初始化器实现结束时自动调用。总是调用超类非初始化器,即使子类不提供自己的非初始化器。...Player类定义了一个win(coins:)方法,该方法从银行检索一定数量的硬币并将其添加到玩家的钱包中。Player类还实现了去初始化器,该去初始化器是在Player实例被释放之前调用的。

    10700

    Swift学习笔记(初始化过程)

    km以及网上介绍swift基本语法的文章已经有不少,我这里就不累赘。这篇文章主要想讲的是:swift的初始化。 首先必须明确的两个基本点是: 1.swift中最基本的数据类型是结构体,类以及枚举。...类特有的构造函数特点: 1.指定构造函数和便利构造函数: 指定构造函数是指 初始化当前类中的所有属性,并调用父类的构造函数来完成父类属性的初始化。...swift将执行以下四个检查来满足两段式的要求: 安全检查 1 指定构造器必须保证它所在类引入的所有属性都必须先初始化完成,之后才能将其它构造任务向上代理给父类中的构造器。...完成新实例内存的分配,但此时内存还没有被初始化。 指定构造器确保其所在类引入的所有存储型属性都已赋初值。存储型属性所属的内存完成初始化。 指定构造器将调用父类的构造器,完成父类属性的初始化。...swift中的初始化过程就介绍到这里,上面较为详细的介绍了各种规则和注意点,虽然实际开发中可能不一定都会用到,但是了解清楚可以一定程度的避免踩坑,也能更深入地体会到swift的特点。

    1.3K60

    Swift3.0 - 初始化和释放

    ,初始化没有默认值的非可选存储属性 5.结构体系统默认会添加初始化方法,当然自己也可以自定义 6.子类如果没有自己的初始化方法,系统默认使用父类的初始化方法,一旦有了自己的初始化方法,或者重写了父类的初始化方法...,则父类的所有初始化不能被子类调用 7.你可以给子类添加和父类相同的初始化方法,但需要加上override 修饰 8.重写父类的convenience修饰的方便初始化方法,不需要加override...,子类的初始化方法,必须调用父类的指定初始化方法,不能调用使用convienience修饰的方便初始化方法 4.在swift3.0 初始化中,可以自己调用自己的初始化方法,系统不会检测出来,在创建convenience...4.然后去调用父类的指定初始化方法,任务和调用自己指定初始化方法相同 5.继续在类继承链中指定上述过程,直到达到链的顶部为止 6.当到完成基类的初始化的时候,实例的初始化算是完成了,我们的第一阶段完成...override ,然后调用父类的指定初始化方法 4.重写父类的方便初始化方法(convenience) 不需要加override 或者convenience 关键字,调用父类的指定初始化方法,如果加上

    55610

    swift 类和结构体

    () 所有结构体会自动生成一个构造器,用于初始化结构体中的属性(类没有此功能) let ter = Teacher(name: "teacher", age: 30) 属性访问 student.name...teacher.name = "teacher" print(student.name) print(teacher.name) 结构体是值类型 值类型被赋予给一个变量、常量或被传递给一个函数的时,其值会被拷贝(在 Swift...== if stu === stu1 { print("same Student instance") } 类和结构体对比 Swift 中类和结构体有很多共同点 定义属性用于存储值...定义方法用于提供功能 定义下标可以使用下标语法来访问实例所包含的值 定义构造器用于生成初始化值 通过扩展可以增加默认实现的功能 通过协议可以提供某种标准功能 与结构体相比,类还有如下的附加功能 继承允许一个类继承另一个类的特征...类型转换允许在运行时检查和解释一个类实例的类型 析构器允许一个类实例释放任何其所被分配的资源 引用计数允许对一个类的多次引用 注意 结构体总是通过被复制的方式在代码中传递,不使用引用计数

    18910

    Swift基础 结构和类

    翻译自:https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html 结构和类是通用的、灵活的结构,成为程序代码的构建块...在Swift中,您在单个文件中定义结构或类,该类或结构的外部接口会自动供其他代码使用。 注意 类的实例传统上被称为对象。...然而,与其他语言相比,Swift结构和类的功能要接近得多,本章的大部分内容描述了适用于类或结构类型的实例的功能。因此,使用了更通用的术语实例。 比较结构和类 Swift中的结构和类有很多共同点。...最简单的初始化器语法形式使用类或结构的类型名称,后跟空括号,如Resolution()或VideoMode()。这会创建一个类或结构的新实例,任何属性都初始化为默认值。...类和结构初始化在初始化中进行了更详细的描述。 访问属性 您可以使用点语法访问实例的属性。

    9900

    Swift 类和结构体

    Swift 中类和结构体有很多共同点。...存储属性是被捆绑和存储在类或结构体中的常量或变量。当这两个属性被初始化为整数0的时候,它们会被推断为Int类型。...构造器语法的最简单形式是在结构体或者类的类型名称后跟随一对空括号,如Resolution()或VideoMode()。通过这种方式所创建的类或者结构体实例,其属性均会被初始化为默认值。...构造过程章节会对类和结构体的初始化进行更详细的讨论。 属性访问 通过使用点语法,你可以访问实例的属性。...Swift 中的这些引用与其它的常量或变量的定义方式相同。 类和结构体的选择 在你的代码中,你可以使用类和结构体来定义你的自定义数据类型。 然而,结构体实例总是通过值传递,类实例总是通过引用传递。

    1.2K40

    Swift 类构造器的使用

    _wv=1027&k=lzJejkSl),不管你是大牛还是小白都欢迎入驻 使用 init 方法的正确姿势 苹果的官方文档关于构造器的部分请戳这里 在 Swift 中, 类的初始化有两种方式, 分别是...init 机制 在 Swift 中一个实例的初始化是分为两个阶段的 第一阶段是实例的所有属性被初始化. 第二阶段是实例的所有属性可以再次的调整以备之后的使用....Swift 的编译器会对初始化的方法进行安全地检查已保证实例的初始化可以被安全正确的执行: 指定构造器必须要确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化, 之后才能将其它构造任务代理给父类中的构造器...跟 ObjC 不同, Swift 中的子类默认不会继承来自父类的所有构造器. 这样可以防止错误的继承并使用父类的构造器生成错误的实例(可能导致子类中的属性没有被赋值而正确初始化)....总结 Swift 中构造器需要遵循的规则还是很多的, 总结一下, 有以下规则: 调用相关 指定构造器必须调用它直接父类的指定构造器方法. 便利构造器必须调用同一个类中定义的其它初始化方法.

    1.7K20

    java类初始化顺序

    也就是说,构造代码块中定义的是不同对象共性的初始化内容。 静态代码块 它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。...类调用时,先执行静态代码块,然后才执行主函数的 静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的 静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别 一个类中可以有多个静态代码块...,并初始化父类静态成员变量 执行子类的静态代码块,并初始化子类静态成员变量 执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量 执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量...总结 java类初始化执行顺序如下: 父类静态变量 父类静态初始化块 子类静态变量 子类静态化初始化块 父类变量 父类初始化块 父类构造器 子类变量 子类初始化块 子类构造器 规律是 静态变量、静态代码块...->普通变量、初始化块、构造器 因为静态代码块是跟类关联的,所以只执行一次,并且优先级最高 参考资料 java类初始化顺序

    85710

    构造方法、类的初始化块以及类字段的初始化顺序

    多构造函数 类的初始化块 ​ 如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?...value; } public InitializeBlockClass() { } } 这是一个生造出来展示Java语法特性的示例类,...在实际开发中不要这样写代码,应该尽量保证一个字段只初始化一次! ​...} 规律(类字段的初始化顺序) 执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。 执行类的构造函数。...类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

    54420
    领券