iOS学习

iOS碎片化知识点汇总(持续更新)

2019-03-31  本文已影响13人  奥利奥_2aff

语言

weak, _ _weak 和 _ _block 修饰符

Objective-C中,weak用于修饰属性,__weak__block用于修饰局部变量.

weak __weak __block
修饰对象 属性 局部变量 局部变量
意义 弱引用 弱引用 block以外弱引用, block以内保留引用, 需要在block内手动释放.

Swift中只有weak修饰符, 同时用于声明一个变量或者属性为弱引用, 并没有__block意义上的声明.

便利构造函数 (designated, convenience)

便利构造函数(designated initializer)是为了保证类型在初始化后, 其所有属性的值都是存在的.

在Swift中, 又多了一个关键字convenience去加强这个特性.convenience initializer的作用在于, 可以规定一个类型的属性的初始值.

designated convenience
存在性 Objective-C, Swift Swift

struct 和 class

很大路的知识点struct是值类型, 而class是引用类型.

关键在于,一个struct实例的属性里面存在一个引用类型class的时候, 使用这个struct去赋值到一个新的变量的时候,struct属性里面的class会被怎么处理?


class Teacher: NSObject {

var name: String

init(name: String) {

self.name = name

}

}

struct Room {

var memberNum: Int

var teacher: Teacher

}

let room = Room(memberNum: 1, teacher: Teacher(name: "oreo"))

var room2 = room

room2.memberNum = 2

room2.teacher.name = "loli v"

print(room.memberNum,room.teacher.name)

print(room2.memberNum, room2.teacher.name)

print(room2.teacher == room.teacher)

room2.teacher = Teacher(name: "oreo")

print("modify room2's teacher")

print(room.memberNum,room.teacher.name)

print(room2.memberNum, room2.teacher.name)

print(room2.teacher == room.teacher)

/*

结果:

1 loli v

2 loli v

true

modify room2's teacher

1 loli v

2 oreo

false

*/

可以看到,room赋值之后room2,room2的值类型属性被拷贝了一份, 修改room2memberNum不会影响room.

但是room2的引用类型属性, 其实是拷贝了一份room对应属性的地址, 所以修改room2teacher的属性, 会影响room,而重新给room2赋值一个新的Teacher实例之后, 两个Room实例里面的引用型属性就不是同一个了.

运算符

在OC中运算符是针对值类型使用的.

在Swift中, 用户可以自定义运算符, 运算符可以用在应用型对象身上. 并且用户可以自己定义运算符的功能.

协议 protocol

extension


Foundation

double 和 NSDecimalNumber

项目中我们使用double表示和存储小数, 而在需要对小数进行计算的时候, 比如电商项目的购物车功能要进行金额结算, 我们使用double就可能出现金额精度不正确的问题.

针对小数运算, Apple给我们提供了一个专门的类: NSDecimalNumber, NSDecimalNumber进行算数运算的方式是通过调用函数, 在Swift中可以用链式的方法计算, NSDecimalNumber运算结果仍然是一个NSDecimalNumber, 我们可以使用它的对应属性获得我们想要的值类型.

struct Item {
    let unitPrice: Double
}
struct Coupon {
    let value: Double
}
// 20件商品, 75折
let item = Item(unitPrice: 9.99)
let coupon = Coupon(value: 0.75)
let count: Int = 20
let dPrice = NSDecimalNumber(value: item.unitPrice)
let dCount = NSDecimalNumber(value: count)
let dCouponValue = NSDecimalNumber(value: coupon.value)
let result = dPrice.multiplying(by: dCouponValue).multiplying(by: dCount)
let doubleResult = result.doubleValue
let stringResult = result.stringValue

GCD

GCD会自动管理线程的生命周期(创建线程, 调度任务, 销毁线程). 我们调用GCD的时侯不会面对线程, 而是面对队列. 就是说:

即使N次调用了异步执行并发队列, 并不代表我们创建了N个的子线程.


UIKit

UIView 和 CALayer 的关系

当我们需要在屏幕上显示一些元素的时候, 一般会使用到UIView的各种子类. 而实际上如果我们只需要实现单纯的显示功能, 也可以直接使用CALayer去实现.

相比起UIVIew, CALayer并不具备交互的功能, 就是不能响应任何点击拖拽行为.查看UIView的类不难发现, 它自身也有一个layer的属性, 其对应的其实就是用于显示在屏幕上的CALayer对象.

UIViewsubviewsCALayersublayers是对应关系.

待完成

Responder

待完成


BluetoothKit


RxSwift

上一篇 下一篇

猜你喜欢

热点阅读