2021笔记
-
static修饰局部变量
局部变量:在函数/方法/代码块内声明的变量。它的生命周期、作用域都是在这个代码块内。
-
当全局变量使用static修饰时
其生命周期没有变,依旧是在程序结束时才销毁。但是其作用域变了,以前是整个源程序(用extern),现在只限于申明它的这个文件才可见,即使用extern引用也不行。
-
异步绘制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yl7fo6YY-1690702026117)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled.png)]
-
离屏渲染
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmkoLcPC-1690702026118)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%201.png)]
-
分类可以添加:
- 实例方法
- 类方法
- 协议
- 属性(需要用关联对象添加get set方法,没有成员变量,但是可以用关联对象添加属性,但不是真正的加在该类上面,会加在一个全局的hashmap中管理)
-
当该类有多个分类,分类中出现一样的方法,那么最后编译的分类中的方法会生效,把前面的覆盖了
-
分类和扩展的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kOpjsXQT-1690702026119)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%202.png)]
-
KVO监听的是属性的set方法,不是成员变量
-
属性关键字atomic是指对该属性的赋值和获取是线程安全的,对其的操作不保证安全(数组添加元素删除元素)
-
weak和assign的区别
- assign既可以修饰基本数据类型也可以修饰对象,weak只能修饰对象
- assign修饰的对象被销毁后,指针还是会指向之前的内存,weak会置为nil
- assign适合修饰基本数据类型,因为基本数据类型是放在栈上的,自动销毁
-
NSMapTable可以对象映射对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OjIxoC6t-1690702026119)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%203.png)]
-
经典死锁问题的图解(注意:是队列引起的死锁)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcqdpEB0-1690702026119)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%204.png)]
-
腾讯的一道很难的多线程题
解释:输出为13,performSelector方法失效了,因为这个代码运行在全局并发队列中的一个线程中,但GCD所维护的线程默认不开启runloop循环,performSelector:withObject:afterDelay必须所在线程开启runloop才行,因为用到了延时,底层是开启了个计时器,但是计时器需要放到runloop才行,如果用performSelector就不会有这个问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31FTHnIn-1690702026120)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%205.png)]
-
多读单写的实现(可以并发读取,但是写入操作只能串行)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A27qmoc5-1690702026120)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%206.png)]
-
runloop是一个循环,处理事件和消息的对象,没有事件时,可以休眠,有事件时立刻唤醒
-
@synthesize和@dynamic
- @synthesize 的作用:是为属性添加一个实例变量名,或者说别名(带下划线的_name)。同时会为该属性生成 setter/getter 方法。
- 禁止@synthesize:如果某属性已经在某处实现了自己的 setter/getter ,可以使用 @dynamic 来阻止 @synthesize 自动生成新的 setter/getter 覆盖。
-
时间复杂度O(n),代表这个操作需要n步骤,时间复杂度代表这个操作需要多少步骤,比如O(n^2)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndlUEg7C-1690702026120)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%207.png)]
-
NSCache
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ePF3klN-1690702026121)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%208.png)]
-
循环引用的几种情况
-
代理
-
block
-
NSTimer(使用中间对象来弱持有timer对象和原对象,或使用带block的定时器方法)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HfbR2K0-1690702026121)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%209.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rYr2S1r5-1690702026121)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%2010.png)]
-
-
模块化开发的好处
多人开发时,可以单独开发自己的模块,效率高
多个模块拆分开来,目录清晰,功能独立,解耦
其他人引用自己开发的模块时,可以只调用入口文件,不必考虑实现文件,即使实现文件没导入也不会报错闪退
-
BOOL result1 = [err caseInsensitiveCompare:@“7B”]==NSOrderedSame;// 不区分大小写比较
-
自定义对象和容器累对象(nsstring)的深拷贝浅拷贝是不一样的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBke3pG1-1690702026121)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/Untitled%2011.png)]
-
NSSet和NSArray区别
-
assign修饰的对象是不增加引用计数的,只有strong,浅拷贝
-
消息传递
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hiTNL76o-1690702026122)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/3E8F4554-DB67-4C6F-8857-FBF537D8259A.png)]
-
内存管理
-
ARC是编译器和runtime共同协作的,通过动态插入release,retain等
-
为什么weak指针指向的内存空间最后会被置为nil,因为在dealloc中有相关逻辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gs2VwQkn-1690702026122)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/068206BA-0929-4F47-A469-0FC91B79D6C0.png)]
-
每个对象都有一个弱引用数组表,用来管理曾经他被弱引用的指针对象,最后通过这个弱引用数组表把所有的都置为nil
-
autoreleasepool的原理
哨兵对象:在嵌套
autoreleasepool
时,就是加了个哨兵对象,就是为了区分各个autoreleasepool
的管理区域。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pmJG93O0-1690702026122)(2021%E7%AC%94%E8%AE%B0%209a9ab49c793346e4affc376e17a12c5e/ECAE7551-FEB2-4142-9769-2BF3C6FBB8D1.png)]