swift-6-汇编分析闭包表达式和闭包本质

一、枚举、结构体、类都定义方法

方法占用对象的内存么?

不占用

方法的本质就是函数

方法、函数都存放在代码段,因为方法都是公共的,不管对象还是对对象的调用方法都是一样的,所以放在代码段,但是每个对象的成员不一样所以放在每个对象的内存里面

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 函数调用栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值