答:1.从管理方式来讲对于栈来讲,是由编译器主动管理,无需我们手工控制;对于堆来说,开释工作由步调员控制,容易产生内存泄露(memory leak)2.从申请巨细巨细方面讲栈空间比力小堆控件比力大3.从数据存储方面来讲栈空间中一般存储根本范例,对象的地点堆空间一般存放对象自己,block的copy等复制代码答:# 堆堆是一种颠末排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构中通常可以被看做是一棵树的数组对象。而且堆需要满意一下两个性子:1)堆中某个节点的值总是不大于或不小于其父节点的值;2)堆总是一棵完全二叉树。堆分为两种情况,有最大堆和最小堆。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆,在一个摆放好元素的最小堆中,父结点中的元素肯定比子结点的元素要小,但对于左右结点的巨细则没有规定谁大谁小。堆常用来实现优先队列,堆的存取是随意的,这就犹如我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取恣意一本时不必像栈一样,先取出前面全部的书,书架这种机制差别于箱子,我们可以直接取出我们想要的书。# 栈栈是限定仅在表尾举行插入和删除操纵的线性表。我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈的特别之处在于它限定了这个线性表的插入和删除位置,它始终只在栈顶举行。栈是一种具有后进先出的数据结构,又称为后进先出的线性表,简称 LIFO(Last In First Out)结构。也就是说后存放的先取,先存放的后取,这就类似于我们要在取放在箱子底部的东西(放进去比力早的物体),我们起主要移开压在它上面的物体(放进去比力晚的物体)。堆栈中界说了一些操纵。两个最告急的是PUSH和POP。PUSH操纵在堆栈的顶部到场一个元素。POP操纵相反,在堆栈顶部移去一个元素,并将堆栈的巨细减一。栈的应用—递归# 队列队列是只允许在一端举行插入操纵、而在另一端举行删除操纵的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。它是一种特别的线性表,特别之处在于它只允许在表的前端举行删除操纵,而在表的后端举行插入操纵,和栈一样,队列是一种操纵受限定的线性表。队列是一种先辈先出的数据结构,又称为先辈先出的线性表,简称 FIFO(First In First Out)结构。也就是说先放的先取,后放的后取,就犹如行李过安检的时间,先放进去的行李在另一端总是先出来,后放入的行李会在末了面出来。复制代码11.什么是多态?什么是分类?什么是协议?
答:struct是值范例,class是引用范例。值范例的变量直接包罗它们的数据,对于值范例都有它们自己的数据副本,因此对一个变量操纵不大概影响另一个变量。引用范例的变量存储对他们的数据引用,因今后者称为对象,因此对一个变量操纵大概影响另一个变量所引用的对象。二者的本质区别:struct是深拷贝,拷贝的是内容;class是浅拷贝,拷贝的是指针。property的初始化差别:class 在初始化时不能直接把 property 放在 默认的constructor 的参数里,而是需要自己创建一个带参数的constructor;而struct可以,把属性放在默认的constructor 的参数里。变量赋值方式差别:struct是值拷贝;class是引用拷贝。immutable变量:swift的可变内容和不可变内容用var和let来甄别,如果初始为let的变量再去修改会发生编译错误。struct遵照这一特性;class不存在如许的标题。mutating function: struct 和 class 的差別是 struct 的 function 要去改变 property 的值的时间要加上 mutating,而 class 不消。继续: struct不可以继续,class可以继续。struct比class更轻量:struct分配在栈中,class分配在堆中。复制代码答:class 有以下功能,struct 是没有的:class可以继续,子类可以利用父类的特性和方法范例转换可以在运行时查抄息争释一个实例对象class可以用 deinit来开释资源一个类可以被多次引用struct 上风:结构较小,实用于复制操纵,相比力一个class 实例被多次引用,struct 更安全无需担心内存泄露标题复制代码2.Swift 是面向对象照旧函数式的编程语言?
答:Swift 既是面向对象的,又是函数式的编程语言。说 Swift 是面向对象的语言,是由于 Swift 支持类的封装、继续、和多态,从这点上来看与 Java 这类纯面向对象的语言险些毫无差别。说 Swift 是函数式编程语言,是由于 Swift 支持 map, reduce, filter, flatmap 这类去除中心状态、数学函数式的方法,更加夸大运算效果而不是中心过程。复制代码3.什么是泛型,swift哪些地方利用了泛型?
答:值范例(好比:struct),在复制时,复制对象与原对象实际上在内存中指向同一个对象,当且仅当修改复制的对象时,才会在内存中创建一个新的对象,为了提升性能,Struct, String、Array、Dictionary、Set接纳了Copy On Write的技术好比仅当有“写”操纵时,才会真正实验拷贝操纵对于标准库值范例的赋值操纵,Swift 能确保最佳性能,全部没须要为了包管最佳性能来克制赋值复制代码13.什么是属性观察?
答:自省在OC中就是判定某一对象是否属于某一个类的操纵,有以下2中方式[obj iskinOfClass:[SomeClass class]][obj isMemberOfClass:[SomeClass class]]在 Swift 中由于很多 class 并非继续自 NSObject, 故而 Swift 利用 is 来判定是否属于某一范例, is 不但可以作用于class, 照旧作用于enum和struct复制代码19.什么是函数重载? swift 支不支持函数重载?
答:1.关联值--偶然会将摆列的成员值跟其他范例的变量关联存储在一起,会非常有用// 关联值enum Date { case digit(year: Int, month: Int, day: Int) case string(String)}2.原始值--摆列成员可以利用类似范例的默认值预先关联,这个默认值叫做:原始值// 原始值enum Grade: String { case perfect = "A" case great = "B" case good = "C" case bad = "D"}复制代码21.swift 中的闭包结构是什么样子的?什么是尾随闭包?什么是逃逸闭包?什么是主动闭包?
答:Swift中跟实例对象干系的属性可以分为2大类存储属性(Stored Property)类似于成员变量这个概念存储在实例对象的内存中结构体、类可以界说存储属性摆列不可以界说存储属性盘算属性(Computed Property)本质就是方法(函数)不占用实例对象的内存摆列、结构体、类都可以界说盘算属性struct Circle { // 存储属性 var radius: Double // 盘算属性 var diameter: Double { set { radius = newValue / 2 } get { return radius * 2 } }}复制代码23.什么是耽误存储属性(Lazy Stored Property)?
答:利用lazy可以界说一个耽误存储属性,在第一次用到属性的时间才会举行初始化(类似OC中的懒加载)lazy属性必须是var,不能是let let必须在实例对象的初始化方法完成之前就拥有值如果多条线程同时第一次访问lazy属性 无法包管属性只被初始化1次 class PhotoView { // 耽误存储属性 lazy var image: Image = { let url = "https://...x.png" let data = Data(url: url) return Image(data: data) }() } 复制代码24.swift 中如何利用单例模式?
答:可以通过范例属性+let+private 来写单例; 代码如下如下: public class FileManager { public static let shared = { // .... // .... return FileManager()}() private init() { }}复制代码25.swift 中的下标是什么?
答:利用subscript可以给恣意范例(摆列、结构体、类)增长下标功能,有些地方也翻译为:下标脚本subscript的语法类似于实例方法、盘算属性,本质就是方法(函数)利用如下:class Point { var x = 0.0, y = 0.0 subscript(index: Int) -> Double { set { if index == 0 { x = newValue } else if index == 1 { y = newValue } } get { if index == 0 { return x } else if index == 1 { return y } return 0 } }}var p = Point()// 下标赋值p[0] = 11.1p[1] = 22.2// 下标访问print(p.x) // 11.1print(p.y) // 22.2复制代码26.扼要阐明Swift中的初始化器?