一、枚举、结构体、类都定义方法
方法占用对象的内存么?
不占用
方法的本质就是函数
方法、函数都存放在代码段,因为方法都是公共的,不管对象还是对对象的调用方法都是一样的,所以放在代码段,但是每个对象的成员不一样所以放在每个对象的内存里面
1.1
方法占用对象的内存么? 不占用
方法的本质就是函数
方法、函数都存放在代码段
1.2 代码段 全局变量 堆空间的占用分配情况
二、闭包表达式
在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数
函数的表示
func sum(_ v1: Int, _ v2: Int) -> Int { v1 + v2 }
闭包的表示
var fn = {
(v1: Int, v2: Int) -> Int in
return v1 + v2
}
fn(10, 20)
{
(v1: Int, v2: Int) -> Int in
return v1 + v2
}(10, 20)
{
(参数列表) -> 返回值类型 in 函数体代码
}
闭包类型定义
// 定义闭包,这里使用 [weak self] 避免循环引用
let checkIfDownloadPathExists: (String) -> Bool = { [weak self] path in
guard let self = self else { return false }
let fileManager = FileManager.default
return fileManager.fileExists(atPath: path)
}
func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) {
print(fn(v1, v2))
}
三、闭包表达式的简写
四、尾随闭包
如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以增强函数的可读性
尾随闭包是一个被书写在函数调用括号外面(后面)的闭包表达式
五、数组的排序
func sort(by areInIncreasingOrder: (Element, Element) -> Bool)
函数传入
/// 返回true: i1排在i2前面 /// 返回false: i1排在i2后面
func cmp(i1: Int, i2: Int) -> Bool {
// 大的排在前面
return i1 > i2 }
var nums = [11, 2, 18, 6, 5, 68, 45]
nums.sort(by: cmp)
// [68, 45, 18, 11, 6, 5, 2]
闭包传入
nums.sort(by: {
(i1: Int, i2: Int) -> Bool in
return i1 < i2
})
nums.sort(by: { i1, i2 in return i1 < i2 })
nums.sort(by: { i1, i2 in i1 < i2 })
nums.sort(by: { $0 < $1 })
nums.sort(by: <)
nums.sort() { $0 < $1 }
nums.sort { $0 < $1 }
// [2, 5, 6, 11, 18, 45, 68]
六、闭包忽略参数
func exec(fn: (Int, Int) -> Int) {
print(fn(1, 2))
}
exec { _, _ in 10 } // 10
闭包自动推断类型
方法
七、汇编分析闭包 1.25
网上有各种关于闭包的定义,个人觉得比较严谨的定义是
一个函数(func/闭包表达式)和它所捕获的变量\常量环境组合起来,称为闭包
一般指定义在函数内部的函数
一般它捕获的是外层函数的局部变量\常量
分析 有 malloc alloc 是分配堆空间 1.46
分配多少内存空间查看
上面 $0x18 是计算的实际的使用的内存空间数,但是操作系统分配的是16的倍数32
总结 2.02
bt 函数调用栈