面试复习-一些小集合

2021-05-08  本文已影响0人  云无心

集合内部元素如何进行深复制

  1. 使用 initWithArray: copyItems:可以进行集合深复制(需要实现copyWithZone)
  2. 归解档

单例

1、alloc和allocWithZone都可以用于创建实例(其实是用于创建实例的时候分配内存空间)
2、alloc会默认调用allocWithZone方法
3、如果不重写allocWithZone方法,在调用alloc和allocWithZone方法产生的实例可能不是同一个实例,单例未真正实现

利用 runloop 解释一下页面的渲染的过程?

  1. 页面被 setNeedDisplay打上脏标记后,在当前runloop beforeWaitting的时候进行绘制。调用 [CALayer display]会去判断自己的代理是否实现了异步绘制代理 displayer: 此方法是异步绘制的入口,如果为实现,则进行系统绘制
  2. 如果已实现 则调用 [layer.delegate drawLayer:inContext:] 子线程代理生成对应bitmap(core grap方法),主线layer.cnotext=bitmap,

weak原理

  1. weak实现原理 weak内部结构
    1. sideTables weak_table weak_entry_t referrns,锁
  2. retaincount原理
  3. 内存布局

内存泄漏检测

MLeaksFinder (https://www.jianshu.com/p/eb2edcd24791?utm_source=desktop&utm_medium=timeline ):hook一些生命周期,用weak若引用,如果x秒后还在,则断言

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

  1. 可以添加任务依赖,方便控制执行顺序
  2. 可以设定操作执行的优先级
  3. 任务执行状态控制:isReady,isExecuting,isFinished,isCancelled
  4. 最大并发量

main函数之前

  1. 加载 class protocol +load 分类
  2. 动态链接库加载入内存
  3. 加载可执行文件

设计原则

  1. 单一职责:view layer
  2. 依赖导致:抽象不依赖实现,实现可依赖抽象。增删改查,业务层依赖抽象接口,不依赖具体实现
  3. 开闭原则:扩展开放,修改关闭。定义一个类,后续扩展性,数据结构定好,就是加接口,需要前期考虑周全
  4. 里氏替换:父类可以被子类替换,且功能无影响,KVO
  5. 接口隔离:专门协议,而不是一个庞大的协议。tableview:dataSource,delegate
  6. 迪米特:高内聚,低耦合。对象对其他类少了解

Dealloc 实现机制

  1. _objc_rootDealloc()
  1. 有以上情况 object_dispose() ,无则free
  2. object_dispose() 流程为 objc_destructInstance() + free()
  3. objc_destructInstance() 为,
    有hasCxxDtor 则 object_cxxDestruct()
    有 hasAssocitatedObjects 则 object_remove_associations()
  4. 再执行 clearDeallocating()
    -sideTable_clearDellocating()
  1. Dealloc结束
上一篇下一篇

猜你喜欢

热点阅读