1.字节跳动
1.哪些属性使用copy 为什么
NSString,NSArray,NSDictory,Block
1> 当源字符串是NSString时,由于是不可变字符串,所以不管是实用strong还是copy修饰,都是指向原来的对象,copy只是做了一次浅拷贝。
2> 当源字符串是NSMutableString时,strong只是将源字符串的引用计数+1,而copy则是对源字符串做了次深拷贝,从而生成了一个新的对象,并且copy的对象指向这个新对象。
所以,如果源字符串是NSMutableString时,实用strong只会增加引用计数,但copy会执行一次深拷贝,会造成不必要的内存浪费。而如果源字符串是NSString时,strong和copy效果一样,就不会有这个问题。
我们一般声明NSString时,也不希望它改变,所以一般情况下,建议使用copy,这样可以避免NSMutableString带来的错误。
Block的内存地址显示在栈区,我们知道:栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,但是在对block进行copy后,block存放在堆区.所以在使用Block属性时使用Copy修饰
2.weak的原理
weak 实现原理的概括
Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。
weak 的实现原理可以概括一下三步:
1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。
2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。
3、释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。
https://www.jianshu.com/p/13c4fb1cedea
3.block的本质
这说明上面定义的这个block的类型是NSStackBlock,并且它最终继承自NSObject也说明Block的本质是OC对象。
Block有三种类型,分别是NSGlobalBlock,MallocBlock,NSStackBlock。
这三种类型的Block对象的存储区域如下:
<colgroup><col style="width: 70px;"><col style="width: 70px;"></colgroup>
|
类
|
对象的存储域
|
|
NSStackBlock
|
栈
|
|
NSGlobalBlock
|
程序的数据区域(.data区)
|
|
NSMallocBlock
|
堆
|
懒加载介绍-
Lazy,谁懒?当然是计算机偷懒。通常用法,你有一个NSArray的property,但是你不在初始化方法里为其alloc/init,它就只是一个指针,不会占用内存。然后你写了此property的访问器,在访问器里判断此property的指针是否为空,若为空,就alloc/init,这时才真正生成这个NSArray。这样子达到的效果就是,除非这个NSArray被使用,否则它永远不会真正生成,也就不会占用内存。计算机的偷懒行为可能减少内存占用,何乐为不为?其他LazyLoad的思想都是这样:拖到最后一刻,万不得已了,才开始占用资源,这在iPhone这种内存较少的设备上是很有必要的。
4.loaded和initialize区别。如果在load中调用initialize会有什么问题。initialize会 不会有可能在load之前调用
https://www.jianshu.com/p/c4e456f6efc4
5.sel.imp.Mathod 分别是什么。SEL本质是什么
https://blog.csdn.net/qq_42792413/article/details/107879429
6.类的本质
https://blog.csdn.net/oldfish_C/article/details/105151309
7.继承和分类,方法的覆盖关系。
https://blog.csdn.net/lyxleft/article/details/80590957
8.fishhook怎么找到C函数的地址
https://www.jianshu.com/p/fa31e76549de
9.怎么hook block 的事件
https://www.jianshu.com/p/bc44e8338c98
10.离屏渲染
https://www.jianshu.com/p/cff0d1b3c915
字节跳动2面
weak 的实现方式
https://www.jianshu.com/p/13c4fb1cedea
引用计数的存储方式
https://www.jianshu.com/p/4bd96efedd09
Category的相关问题
https://www.jianshu.com/p/ccbd2a07db1f
内存管理的相关内容
网友评论