Day2

2020-07-28  本文已影响0人  Jean_Lina

1 单方向的引用不会产生循环引用。
循环引用:闭包引用了self,self引用了闭包。
Swift推荐使用解决循环引用的方法:[weak self]表示{}中的所有self都是弱引用,需要注意解包

2 解包有两种形式的解包:
(1)可选解包‘?’,如果self已经被释放,不会向对象发送getter消息,更加安全。只是单纯的发送消息。可选项不能直接参与到计算。
(2)强行解包‘!’,如果self已经被释放,强行解包会导致崩溃。参与计算。

3 weak只能修饰var,不能修饰let。

4 MRC中如果要弱引用对象都是使用assign,不会增加引用计数,但是一旦对象被释放,地址不会改变,继续访问,出现野指针。
ARC的weak,本质是一个观察者模式,一旦发现对象被释放,会自动将地址设置为nil,更加安全。
weak的效率会略微差一些。

5 Swift中的构造函数:先给自己的对象实例化分配空间,并设置初始化值,再调用父类的构造函数,给父类的对象实例化分配空间,并设置初始化值。

6 必须释放的:KVO、Timer、Notification、CADisplayLink

7 var label: UILabel?(只是定义,没有分配空间和初始化)

移动端开发,延迟加载,减少内存开销。

8 LLDB是Xcode内置的调试工具
打印输出命令:p、po、print、call
p/print/call输入结果是一样的,po是输出具体对象的内容。

// MARK: 接收到内存警告:添加注释
// FIXME: 修改头像:遗留问题解决

快捷键
cmd + b:编译
cmd + r:运行
cmd + .:停止运行
cmd + n:新建文件
cmd + shift + k:清除缓存
cmd + shift + n:新建项目
cmd + shift + o:打开类
cmd + control + e:修改变量名
cmd + option + /:增加文档注释
option + click:判断类型

9 Swift中不存在基本数据类型,都是结构体。

10 Swift语言特点
Swift特点:快速、现代、安全、互动
1:Swift舍弃了Object-C早期使用的smalltalk语法,全面使用句点表示法。
2:Swift中取消了预编译指令包括宏。
3: Swift取消了Object的指针使用,以及其它不安全访问的使用。
4:可以使用Cocoa和Cocoa Touch框架。
5:对Foundation框架做了大的调整。去掉了NS前缀。将绝大多数的class转换成struct。

11 反射最主要的目的是解耦。
OC的反射机制:
isMemberOfClass:判断是否是某一个类
isKindOfClass:判断是否是某一个类或者该类的子类
performSelector、objc_msgSend:间接调用方法

12 遍历构造函数和OC中抽取分类的方法一样。
(1)遍历构造函数允许返回nil,不能被重写。
(2)正常的构造函数一定会创建对象。
(3)遍历构造函数:判断给定的参数是否符合条件,如果不符合条件,直接返回nil,不会实例化对象,减少不必要内存开销。
(4)只有遍历构造函数中,使用self.init()实例化当前对象,本身不负责属性的创建和初始化工作,调用本身的构造函数进行对象的创建。
(5)没有convenience关键字的构造函数是负责创建对象的,反之用来检查条件的,本身不负责对象的创建。
(6)如果在遍历构造函数设置当前对象属性,一定在self.init()之后。

image.png

13 KVC构造函数:
(1)在使用KVC方法之前,先调用super.init(),保证对象的实例化完成。
(2)在定义模型属性的时候,如果是对象,通常是可选的。在需要的时候创建,避免写构造函数,简化代码。(手机开放中,内存很重要,有些属性不一定要分配内存空间)如果是基本数据类型,不能定义成可选的,必须设置初始化值,否则KVC会崩溃。
(3)如果使用KVC设置数值,属性不能是private的。

14 初始化数组并给定容量大小,避免插入数据的时候,重复分配空间,效率更高一些。

15 服务器响应码:
200 (成功) 服务器已成功处理了请求。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。

16 内存泄漏
当A对象里面强引用了B对象,B对象又强引用了A对象,这样两者的retainCount值一直都无法为0,于是内存始终无法释放,导致内存泄露。
所谓的内存泄露就是本应该释放的对象,在其生命周期结束之后依旧存在。

17 函数的链式编程、链表
链式编程:将多个操作(多行代码)通过某种操作符(通常是点号.)链接成一句的代码,便代码更加紧凑,可读性也更好,降低了代码的重复度。

18 block中有 self.object 或者有属于self的成员但是没有self,就可能造成了block的循环引用问题。

在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
在block前加上 __weak __typeof(self) weakSelf = self;
使block对self获取一个弱引用(refrence count不会加1)。

如果在 Block 内需要多次 访问 self,则需要使用 strongSelf
__strong __typeof(weakSelf) strongSelf = weakSelf;

当加了weakSelf后,block中的self随时都会有被释放的可能,所以会出现一种情况,在调用doSomething的时候self还存在,在doMoreThing的时候self就变成nil了,避免self在执行过程中变成nil,
使用__strong __typeof(weakSelf) strongSelf = weakSelf;

19 对于C语言:函数调用在编译的时候会决定调用哪个函数。
对于OC语言:函数调用属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

20 转发机制
OC中里的消息传递采用动态绑定机制来决定具体调用哪个方法,OC并不是在编译时决定调用哪个函数,而是在运行时决定,因为编译时根本不能确定最终会调用哪个函数,由于运行时可以修改方法的实现。

21 ipa包体积压缩
1:舍弃架构armv7(适配iPhone4)。
2:编译的版本必须是发布版本。
3:查找内部使用到的第三方库,可以进行删减代码,用不到的类,直接删除,第三方库中的图片资源可以删除掉。
4: 代码被定义但从未被调用,去掉冗余的代码。

上一篇 下一篇

猜你喜欢

热点阅读