掌握 iOS 常用关键字
Self self 区别
官方文档: https://docs.swift.org/swift-book/ReferenceManual/Types.html#ID610
The Self type refers to the same type as the type(of:) function in the Swift standard library.
在Swift标准库里 Self 类型遵守和type(of:) 方法相同的类型 .
Self.someStaticMember to access a member of the current type is the same as writing type(of: self).someStaticMember
意思是说 type(of: self).someStaticMemeber 等同于 Self.somStaticMember
self 指当前类型本身 比如: someclassAa
Self 指类型实例 比如: classAa()
Self 在开发中
封装一个 view 快速获取xib实例对象:
1 | // 供外部当前类型调用的 类方法 |
1 | // 供外部当前类型调用的 实例方法 |
@discardableResult
不使用返回值的警告 ⚠️
我们写的方法有返回值, 如果在调用的时候不适用, 一般都会报一个警告,
如果不想提示警告, 可添加@discardableResult 来屏蔽.
举例使用场景
一般我们在做功能类封装时会返回当前实例, -> Self , 如果外部没有使用当前实例 Self ,
会给出一个黄色⚠️, 方法的头部添加@discardableResult 可不显示这个警告.
1 | @discardableResult |
Self关键字常常和@discardableResult配对使用
堆和栈
栈 - 系统自动分配内存
堆 - 程序员手动分配内存
堆:由程序员分配和释放,存放进程运行中被动态分配的内存段,可大可小,根据存储的多少来调节大小。调用alloc等分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用realse释放内存时,被释放的内存从堆中被踢除(堆被缩减),因为我们现在iOS基本都使用ARC来管理对象,所以不用我们程序员来管理,但是我们要知道这个对象存储的位置
栈:栈是由编译器自动分配并释放,用来存放函数括弧“{}”中定义的变量。当函数被调用时,函数带有的参数也会被压入发起调用的进程栈中,待到调用结束后,函数的返回值也回被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。可以把栈看成一个临时数据寄存、交换的内存区
以上中堆和静态区以及常量区都是连续的,栈和代码区都是独立存放的,栈是向低地址扩展的数据结构,是一块连续的内存的区域。堆是向高地址扩展的数据结构,是不连续的内存区域。堆和栈不会碰到一起,之间间隔很大,绝少有机会能碰到一起,况且堆是链表方式存储!
Weak self
Swift 中为了防止循环引用导致释放不掉内存空间, 导致内存溢出.
写法 weak var weakSelf = self
一般开发中我们在 block 闭包, 尾随闭包后面写业务逻辑需要引用当前类的属性, 就会用到 self.xxx
这个时候一般声明 [weak self] in
, 随即写一句代码即可优雅的使用 self.xxx, 首先你要懂这里的 self,其实是 weak self , 才去用, 不然容易混乱.
1 | guard let self = self else { return } // 声明是弱引用 weak var self = self |
@escaping
(1) 闭包会逃逸
(2) 函数执行完才被调用
标明这个闭包是会“逃逸”,通俗点说就是这个闭包在函数执行完成之后才被调用。
1 | // 供外部当前类型调用的 实例方法 |
1 | someAlertView.make().confirmHandler { |
未完待续 …