扬庆の博客

掌握iOS常见关键字

字数统计: 957阅读时长: 3 min
2021/04/02 Share

掌握 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
2
// 供外部当前类型调用的  类方法
static func make() -> Self { return Self.loadFromNib }
1
2
3
4
5
// 供外部当前类型调用的 实例方法
func confirmHandler(handler: @escaping () -> Void ) -> Self {
_handler = handler
return self
}

@discardableResult

不使用返回值的警告 ⚠️

我们写的方法有返回值, 如果在调用的时候不适用, 一般都会报一个警告,

如果不想提示警告, 可添加@discardableResult 来屏蔽.

举例使用场景

一般我们在做功能类封装时会返回当前实例, -> Self , 如果外部没有使用当前实例 Self ,

会给出一个黄色⚠️, 方法的头部添加@discardableResult 可不显示这个警告.

1
2
3
4
@discardableResult
func getInstancce()->Self {
// Code
}

Self关键字常常和@discardableResult配对使用


堆和栈

iOS中栈和堆

栈 - 系统自动分配内存

堆 - 程序员手动分配内存

堆:由程序员分配和释放,存放进程运行中被动态分配的内存段,可大可小,根据存储的多少来调节大小。调用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
2
3
4
5
// 供外部当前类型调用的 实例方法
func confirmHandler(handler: @escaping () -> Void ) -> Self {
_handler = handler
return self
}
1
2
3
someAlertView.make().confirmHandler {
// code
}

未完待续 …

CATALOG
  1. 1. 掌握 iOS 常用关键字
    1. 1.0.1. Self self 区别
      1. 1.0.1.1. Self 在开发中
    2. 1.0.2. @discardableResult
    3. 1.0.3. 堆和栈
    4. 1.0.4. Weak self
    5. 1.0.5. @escaping