我所理解的内存管理,介绍一下内存管理。
答:采用引用计数管理对象内存,当持有该对象,则引用计数加1,不需要了引用计数减1,当应用计数为零的时候,被放入释放池,释放掉。如果不是OC对象,则要自己管理内存,例如调用C语言函数,获取方法数组: Method *methodList = class_copyMethodList(class, &count); 使用完之后,要调用C函数free(methodList),释放内存。
MRC和ARC的区别,以及你的理解。
自动释放池的理解。
自动释放池在MRC和ARC的区别。
block的实现原理,以及你的理解。
block在MRC和ARC下有什么区别。
block 变量修饰词有哪些,都有那些作用。
答:针对局部变量,全局变量,全局静态变量,局部静态变量,block捕获后都做了哪些处理,在这个链接下面说的很清楚。
https://blog.csdn.net/li15809284891/article/details/62896569
多层自动释放池嵌套的对象在那一层释放。
autorealsepool什么时候释放。
属性的理解,strong,weak,assign。
如果属性完全不加修饰词用weak,atomic,系统会怎么处理。
weak的实现原理。
深拷贝和浅拷贝的理解,为什么是这样。
category和extension的区别,系统如何底层实现的。
消息转发机制实现。
KVO简单介绍一下:
答:
1.如果使用
a.监听某个对象的属性
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
b.实现协议
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary *)change context:(nullable void *)context;
c.移除监听
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
底层实现原理:KVO是通过isa-swizzling技术实现的。运行时根据原类创建一个中间类,这个中间类是原类的子类,并动态修改当前对象的isa指针指向中间类,并且将class 方法重写,返回原类的class。苹果建议通过class 实例方法来获取对象类型。
CSDN:https://www.cnblogs.com/guohai-stronger/p/9473551.html
掘金:https://juejin.im/post/5aef18b76fb9a07aa34a28e6
当某个类的对象在第一次被观察时,系统会在运行时动态创建一个该类的子类,在该子类中重写setter方法真正实现通知机制;派生类重写了 class 方法以“欺骗”外部调用者它就是起初的那个类。然后系统将这个对象的isa指针指向这个新诞生的派生类,因此这个对象就成为该派生类的对象了,因而在该对象上对setter的调用就会调用重写的setter,从而激活键值通知机制。此外,派生类还重写了dealloc方法来释放资源。
如何声明一下全局变量。
答:
1.在AppDelegate.h 中声明的变量,因为AppDelegate是单利,并且程序内所有文件都可用。
2.extern NSString * const 修饰的变量;
如何分析crash,以及如何收集crash。
请看这里: https://www.jianshu.com/p/ade5f6acf4d8
网友评论