141 – iOS需要知道的知识点

15. 五月 2019 iOS 0

1.同一个类的两个category里有相同的方法,调用时,会有什么问题?

看到这个问题时,想到了同样的方法在一个类里写两边,我以为会报错。
Duplicate declaration of method 'xxx_function_name'这样的错。
但其实只会有一个警告:
instance method 'tryOneMethodRepeat' in category from filePath/BMethod+OtherViewController.o conflicts with same method from another category
说明了一下:一个方法同时存在两个category里。

那么意思就是可以编译通过,那么调用的时候结果呢?

我在 OtherViewController(AMethod) 中的tryOneMethodRepeat方法打印methodA,同样在 OtherViewController(BMethod) 中的tryOneMethodRepeat方法打印methodB

结果打印的是:methodB

我们思考下category里的方法是在什么时候添加到类对象里的?在初始化一个类之后,调用loadimage时,会重新布局class,这时回调用 attachCategories方法,可以看看这篇博客:Category 原理源码分析 load、initialize方法

其实,执行的方法和编译代码的顺序有关,会调用最后编译的那个。

当我们在工程文件->Build Phases->Compile Sources里面调整编译顺序之后(从下到上编译),调用tryOneMethodRepeat之后,则会打印出 methodB

2.有其他一个编译好的模块extension中有生命一个属性供内部使用,现在外部需要使用,想开放出来,有几种方法?

3.block的拷贝

我们都知道,block在几种情况下(主动copy或成为逃逸闭包时),会从栈拷贝到堆上去。

但是,里面的临时变量也是否会被复制到堆上去呢?或者说,是block整个闭包里的东西全部复制到堆上,还是只有捕获的变量会被复制到堆上?

具体的block更详细的知识,我在另外一篇文章中iOS中的block写到。

 

4.nil调用方法为什么不会崩溃?

https://www.jianshu.com/p/df6629ec9a25

5.didFinishLaunchingWithOptions return no会发生什么?

正常运行程序,返回NO,不处理
官方:NO if the app cannot handle the URL resource or continue a user activity, otherwise return YES. The return value is ignored if the app is launched as a result of a remote notification.

6.KVO原理

定义子类,复写set函数,通过set语法,点语法来处理来进行通知

7.block匿名函数

没有函数名,直接将函数体赋值给函数指针

8.GCD具体实现

dispatch_after是延迟提交,不是延迟运行 就是入队,指的就是将一个Block在特定的延时以后,加入到指定的队列中,不是在特定的时间后立即运行!

9.https建立连接过程

客户端 过程 服务端
发送客户端支持的加密协议及版本:ssl/tls
返回证书(包含公钥)
用根证书验证证书合法
合法性通过
使用公钥对秘钥(生成的随机数)加密
发送加密后的(随机数)密钥
 服务端使用私钥解密数据得到真正的随机数(秘钥)
发送对称密钥加密的数据
客户端解密,开始通信

 

10.load和initialize的调用,还有add category的时机

initialize调用在类第一次接收到消息时触发。
认识load方法 -> 引申dyld详解
load和category的加载,在iOS app启动的时候。

11.NSCache(缓存机制的理解->用NSDictionary创建一个缓存)

几个点:内存缓存大小 -> 数据竞争 -> 效率 -> 写入本地(持久化)-> LRU机制

FPS = Frame per Second,每一秒屏幕刷新多少次
CADisplayLink:用于同步屏幕刷新频率的计时器,有属性时间戳timestamp,这个属性用来返回上一次屏幕刷新的时间戳
如何使用CADisplayLink来进行FPS检测:

13.离屏渲染、vsync信号、卡顿的原因

绘制像素到屏幕上
离屏渲染可以被 Core Animation 自动触发,或者被应用程序强制触发。屏幕外的渲染会合并/渲染图层树的一部分到一个新的缓冲区,然后该缓冲区被渲染到屏幕上
离屏渲染优化详解:实例示范+性能测试

14.响应链和传递链

iOS触摸事件全家桶
响应链总结,每一个UITouch都会发送给hittestUIGestureRecognizers
当手势识别成功,则会让hittest取消响应,手势执行target:action。
当手势识别失败,hittest会沿着响应链传递

 

15.查看app启动的premain时间

在scheme中加入环境变量:DYLD_PRINT_STATISTICS:1

16.关闭TaggedPointer的混淆

在scheme中加入环境变量:OBJC_DISABLE_TAG_OBFUSCATION:YES

开启混淆:

关闭混淆:

 

17. @property(class)

声明类的成员变量,你平时怎么用?