集合内部元素如何进行深复制
- 使用 initWithArray: copyItems:可以进行集合深复制(需要实现copyWithZone)
- 归解档
单例
1、alloc和allocWithZone都可以用于创建实例(其实是用于创建实例的时候分配内存空间)
2、alloc会默认调用allocWithZone方法
3、如果不重写allocWithZone方法,在调用alloc和allocWithZone方法产生的实例可能不是同一个实例,单例未真正实现
利用 runloop 解释一下页面的渲染的过程?
- 页面被 setNeedDisplay打上脏标记后,在当前runloop beforeWaitting的时候进行绘制。调用 [CALayer display]会去判断自己的代理是否实现了异步绘制代理 displayer: 此方法是异步绘制的入口,如果为实现,则进行系统绘制
- 如果已实现 则调用 [layer.delegate drawLayer:inContext:] 子线程代理生成对应bitmap(core grap方法),主线layer.cnotext=bitmap,
weak原理
- weak实现原理 weak内部结构
- sideTables weak_table weak_entry_t referrns,锁
- retaincount原理
- 内存布局
内存泄漏检测
MLeaksFinder (https://www.jianshu.com/p/eb2edcd24791?utm_source=desktop&utm_medium=timeline ):hook一些生命周期,用weak若引用,如果x秒后还在,则断言
- Memory Leaks
- Alloctions
- Analyse
- Debug Memory Graph
MRC set,get
- (void)setFssName:(NSString *)fssName {
if (_fssName != fssName) {
[_fssName release];
_fssName = [fssName retain];
}
}
- (NSString *)fssName {
return [[_fssName retain] autorelease];
}
- (void)dealloc {
[_fssName release];
[super dealloc];
}
NSOperation GCD
- 可以添加任务依赖,方便控制执行顺序
- 可以设定操作执行的优先级
- 任务执行状态控制:isReady,isExecuting,isFinished,isCancelled
- 最大并发量
main函数之前
- 加载 class protocol +load 分类
- 动态链接库加载入内存
- 加载可执行文件
设计原则
- 单一职责:view layer
- 依赖导致:抽象不依赖实现,实现可依赖抽象。增删改查,业务层依赖抽象接口,不依赖具体实现
- 开闭原则:扩展开放,修改关闭。定义一个类,后续扩展性,数据结构定好,就是加接口,需要前期考虑周全
- 里氏替换:父类可以被子类替换,且功能无影响,KVO
- 接口隔离:专门协议,而不是一个庞大的协议。tableview:dataSource,delegate
- 迪米特:高内聚,低耦合。对象对其他类少了解
Dealloc 实现机制
- _objc_rootDealloc()
- NONPointer_ISA
- weakly_reference
- has_assoc
- has_cxx_dtor
- has_sidetable_rc
- 有以上情况 object_dispose() ,无则free
- object_dispose() 流程为 objc_destructInstance() + free()
- objc_destructInstance() 为,
有hasCxxDtor 则 object_cxxDestruct()
有 hasAssocitatedObjects 则 object_remove_associations() - 再执行 clearDeallocating()
-sideTable_clearDellocating()
- weak_clear_no_lock() 弱引用清空
- table.refcnts.eraser() 引用计数表擦除该对象技术
- Dealloc结束