面试复习-一些小集合

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

  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秒后还在,则断言

  • 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

  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()
  • NONPointer_ISA
  • weakly_reference
  • has_assoc
  • has_cxx_dtor
  • has_sidetable_rc
  1. 有以上情况 object_dispose() ,无则free
  2. object_dispose() 流程为 objc_destructInstance() + free()
  3. objc_destructInstance() 为,
    有hasCxxDtor 则 object_cxxDestruct()
    有 hasAssocitatedObjects 则 object_remove_associations()
  4. 再执行 clearDeallocating()
    -sideTable_clearDellocating()
  • weak_clear_no_lock() 弱引用清空
  • table.refcnts.eraser() 引用计数表擦除该对象技术
  1. Dealloc结束
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一 基础知识1.如何令自己所写的对象具有拷贝功能? 目的 想让自己创建的类具有copy方法 第一个返回不可变类型 ...
    王家小雷阅读 1,396评论 0 6
  • 题目: 1. 讲一下你对iOS 内存管理的理解2. KVO实现原理3. 观察者模式4. 如果让你实现 NSNoti...
    林大鹏阅读 2,422评论 0 33
  • 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白...
    iOS开发之家阅读 3,597评论 0 18
  • 原文链接OC内存管理--对象的生成与销毁 在iOS开发中了,我们每天都会使用+ alloc和- init这两个方进...
    NeroXie阅读 2,353评论 3 4
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,626评论 28 53