1.option 的底层实现
苹果公司用option来包括一切,任何语言都会因为数据的匹配读取为空或者不匹配而产生一系列的问题,很显然,苹果公司有想利用option来弥补这种漏洞的野心。
option真正是什么,如果他包裹了一个数据,那么他如果其实真正是什么他就不会去关心,而是很完整的告诉下一个执行,哦,我给你的是一个option的类型,具体的话,你自己想要知道,就自己去看。
网上已经有很多option的讲解,option其实是一个结构体,一个有nil,set组成的结构体,如果没有值的时候,就会给nil,如果有值,就会把值附载在set上,传给需要调用的数据。
解包 (!) 是一个很有意思的想法,如果有了option来包裹,做真正安全的数据类型,为什么还要解包,因为要用里面的值,但是注意必须要有值可用才可以
很简单的来说,swift创造了一种不会出错的安全数据类型来承接很多我们未知的数据,这样可以避免一些数据问题。也统一处理了数据上的差异。
- category 为什么不可以添加属性
在类中使用@property,系统会自动生成带“_”的成员变量和该变量的setter和getter方法。也就是说,属性相当于一个成员变量加getter和setter方法
在分类里使用@property声明属性,只是将该属性添加到该类的属性列表,但是没有生成相应的成员变量,也没有实现setter和getter方法。
category 它是在运行期决议的。 因为在运行期即编译完成后,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的。
Runtime技术中的关联对象可以为类别添加属性。
- timer 在滑动视图的时候为什么会停止
RunLoop只能运行在一种mode下,如果要换mode,当前的loop也需要停下重启成新的。
利用这个机制,ScrollView滚动过程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode会切换到UITrackingRunLoopMode来保证ScrollView的流畅滑动;只有在NSDefaultRunLoopMode模式下处理的事件会影响scrllView的滑动。
如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。
但是因为mode还是可定制的,所以:Timer计时会被scrollView的滑动影响的问题可以通过将timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)来解决
- 协议
https://www.jianshu.com/p/bc644d1fd35b
(1)协议就是用来规范双方行为的
(2)swift语言中的协议作用是用来统一属性、方法、下标的
(3)协议自身是不实现自身的内容 由遵守协议的类、结构体、枚举来实现
(1)、协议用来规范接口(方法)、属性、下标
(2)、协议能够间接实现多继承
(1)使用协议指定属性
可以定义存储属性、类型属性, 必须注明属性的权限(get set)但是协议中定义的属性无论是存储属性还是计算属性 ,协议都是不做区分的。
(2)使用协议指定行为
//[结论]一个协议可以由多个类遵守 一个类可以遵守多个协议 遵守多个协议的行为就是间接实现多继承
//遵守协议的类、结构体、枚举 必须实现协议中的方法
(3)协议中可以指定下标
(4)协议中指定构造方法
//[注意]当类遵守协议 实现协议中的构造方法 那么方法前面必须使用required修饰
(5)使用协议类型定义变量、函数的形参、函数的返回值类型
(6)规范方法/接口(协议的作用)
闭包 逃逸闭包
属于非逃逸闭包,因为闭包就在函数体内执行了 在函数体结束前被调用,闭包是非逃逸型的闭包。
逃逸闭包的定义:
当闭包作为⼀个实际参数传递给⼀个函数的时候,并且是在函数返回之后调⽤,我们就说这个闭包逃逸了。当我们声明⼀个接受闭包作为形式参数的函数时,你可以在形式参数前写 @escaping
来明确闭包是允许逃逸的。
这种不知道什么原因虽然传入了闭包,但并未使用,而是走了一圈又到了全局变量那,这种就是逃逸闭包,需要用escaping声明
比如延时或者同步等等会导致 闭包的值有问题也许不能执行,所以加了关键字,让编译器做对应的处理
闭包做为函数的参数传递时,在函数体结束后被调用,我们就说这个闭包逃离了这个函数体的作用域,这个闭包是逃逸型的闭包,使用@escaping来标注。
逃逸闭包也不能捕获inout
weak 为什么会置为nil
weak assgin 的区别
推送 推送的具体实现
参数加密 为了防止别人抓包 使用过哪些加密;iOS 如何防止抓包
1、抓包原理
为了防止被抓包那么就要了解抓包的原理。
其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假冒的服务再和我们真正的服务交互,这个代理就是一个中间者 ,我们所有的数据都会通过这个中间者,所以我们的数据就会被抓取。HTTPS 也同样会被这个中间者伪造的证书来获取我们加密的数据。
2、防止抓包
为了数据的更安全,那么我们如何来防止被抓包。
第一种思路是:如果我们能判断是否有代理,有代理那么就存在风险。
一、发起请求之前判断是否存在代理,存在代理就直接返回,请求失败。
二、我们可以在请求配置中清空代理,让请求不走代理
我们通过hook到sessionWithConfiguration: 方法。然后清空代理
第二种思路:针对HTTPS 请求。我们判断证书的合法性。
主要是针对HTTPS 请求,对证书的一个验证。
密码用MD5
https://blog.csdn.net/qq_30513483/article/details/60143441
UIStackView distribute 和alignment 怎么使用
https://www.jianshu.com/p/c889d2c075bf
https://www.oschina.net/translate/building-dynamic-layouts-for-ios-with-uistackview?print
使用Masonry 设置约束的优先级 有什么用
https://www.jianshu.com/p/c52275544488
//设置最小宽度
mas_greaterThanOrEqualTo
// 设置抗压缩优先级 优先级高显示完全
UILayoutPriorityDefaultHigh UILayoutConstraintAxisHorizontal
[rightLbl setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
怎么字典转模型
那么Swift 也可以使用 Mirror 来获取 Model 里面的 key - value 哦~
let mirr = Mirror(reflecting: self)
//Mirror 的 children 是一个 (label: String?, value: Any) 元组类型,表示该类的所有属性的名字和类型
网络
nsoperitaion 的使用
信号量 栅栏
下载6张图后在同一刷新
并发3个任务 任务的执行顺序怎么样的
weak 会置为nil的底层实现
swift使用oc的时候怎么使用 使用桥接
1、当我们在swift项目中新建一个oc类的时候,xcode会提示我们要不要同时创建桥接文件,我们点创建,xcode会帮我们自动创建一个桥接文件
文件名格式默认为:{targetName}-Bridging-Header.h。targetName为当前项目的target的名称。
2、在桥接文件中#importOC需要暴露给Swift的内容,这样在swift文件中就可以访问了。
OC想调用swift的时候怎么调用
1、在swift的代码要能被oc调用,其定义的类要继承自NSObject,函数要用@objc定义
或者在类的开头用 @objcMembers 修饰,这样类的所有属性和方法都能被oc访问
2、xcode已经默认生成一个用于OC调用Swift的头文件,文件名格式是:{targetName}-Swift.h,targetName为当前项目的target的名称。
为啥被oc访问的swift的类要继承自NSObject?因为在oc中的类是依赖runtime机制的,而runtime机制需要isa指针,只有继承NSObject才能获得isa指针。
struct和class的区别
什么是值类型 什么是应用类型
class和struct的区别:1、class是引用类型,struct是值类型;2、class可以继承类、接口和被继承,struct只能继承接口,不能被继承;3、class有默认的无参构造函数,有析构函数,struct没有默认的无参构造函数,且只能声明有参的构造函数,没有析构函数;4、class可以使用abstract和sealed,有protected修饰符,struct不可以用abstract和sealed,没有protected修饰符;5、class必须使用new初始化,结构可以不用new初始化;6、class实例由垃圾回收机制来保证内存的回收处理,而struct变量使用完后立即自动解除内存分配;7、从职能观点来看,class表现为行为,而struct常用于存储数据;8、作为参数传递时,class变量以按址方式传递,而struct变量是以按值方式传递的。
swift enum和oc enum有什么区别
OC
1.oc的枚举值相当于这个文件中的一个局部变量,只能是整型
2.不同枚举中,枚举名称不可以一样,在同一文件
swift
3.枚举里可以写方法
4.枚举的rawValue可以是Float(float也是赋值的后面依次+1)或是String,或是没有
5.可以用Rank(rawValue: 3)方法创建一个枚举实例
6.枚举实例可以带参数
怎么根据cell的内容自动计算cell的高度
mvc 和mvvm的区别
https://www.php.cn/faq/417740.html
他们之间的区别主要是MVC中Controller演变成了MVVM中的viewModel。MVVM主要解决了MVC中大量的DOM操作带来的问题。MVVM中当和Model频繁发生变化,开发者需要主动更新到View。
https://www.jianshu.com/p/67ed133cee4f
uiview 和calayer的区别
optional swift里面为什么要引用这个类型