iOS深入学习知识点100+

  1. ARC原理与深入了解
    ARC就是代码中自动加入了retain/release
    AutoReleasePool 原理
    ARC什么时候也会引起内存泄露or crash?
    循环引用
    addObserver后记得在dealloc中调用removeObserver,否则会在通知消息时对象被销毁而引起crash
    使用C语言的接口,其中的对象需要手动进行内存管理,操作不当会引起crash;
  2. Runtime运行时机制原理与使用
    理论上你可以在运行时通过类名/方法名调用到任何 OC 方法,替换任何类的实现以及新增任意类;// 具体实例可参见 JSpatch
    函数执行:对象通过isa指针查找对应的class,先去查找cache中的SEL对应的方法,没查找再去方法列表中(字典方式)查找,未找到再去superclass中去查找,一直往上找,然后到根类后还未查找到,开始进行消息转发;
    消息转发:resolveInstanceMethod -> forwardingTargetForSelector -> methodSignatureForSelector->
    forwordInvocation -
    doesNotRecognizeSelector;
    运行时注册一个新类:
    Class cls = objc_allocateClassPair(superCls, "JPObject", 0);
    objc_registerClassPair(cls);
    class_addMethod(cls, selector, implement, typedesc);
  3. 动画机制
  4. 图层图像的原理与绘制
  5. 多线程原理
    特别是NSOperationQueue与GCD的内部原理
    GCD使用相关函数:
    dispatch_async
    dispatch_get_global_queue
    dispatch_get_main_queue
    dispatch_group_async
    dispatch_group_notify
    dispatch_barrier_async
    dispatch_apply
    Queue的背后原型是什么样的?系统线程池处理
    NSOperationQueue有哪些使用方式?
    NSOperation:继承使用,系统默认有NSBlockOperation跟NSInvocationOperation;main主要用于执行,start执行operation;
    NSOperationQueue 以线程池的方式管理很多operation的执行;

NSOperationQueue 与 GCD 的区别:
NSOperationQueue是基于GCD的封装,GCD的速度更快;
NSOperationQueue可以很方便地调整执行顺序 设置最大并发数量,设置依赖关系;
NSOperationQueue支持KVO,可以监测operation是否正在执行(is Executed),是否结束(is finished),是否取消( is canceld);

  1. block的一些深入理解
    block中的weak self,是任何时候都需要加的么?
    不是的,只有在互相强引用引起循环引用的情况才使用weak self;
    参考:https://stackoverflow.com/questions/20030873/always-pass-weak-reference-of-self-into-block-in-arc

__weak MyObject *weakSelf = self;
[[SomeOtherObject alloc] initWithCompletion:^{
MyObject *strongSelf = weakSelf;
[strongSelf doSomething];
}];
Retain cycles only matter if they exist in the static state of the object. While code is executing and its state is in flux, multiple and possibly redundant retains are fine.

block就是一个里面存储了指向函数体中包含定义block时的代码块的函数指针,以及block外部上下文变量等信息的结构体。
Block结构体中含有isa指针,这就证明了Block其实就是对象,并具有一般对象的所有功能。这个isa指针被初始化为 NSConcreteStackBlock 或者 NSConcreteGlobalBlock 类的地址。
http://www.jianshu.com/p/51d04b7639f1

PS:
UIView 的 animateWithDuration 与 dispatch_async 等其他GCD方法,由于是系统调用block,不用担心担心self引起的循环引用;
instrument的leaks可以调试循环引用;

  1. SDWebImage原理
  2. TableView卡顿
    从缓存或本地读取图片给UIImage时候消耗的时间,需要把读取图像及设置图像的操作放到子线程中处理;
    主要是 heightForRowAtIndexPath 跟 cellForRowAtIndexPath 调用比较频繁,要优化这里面的时间损耗及刷新显示;
    界面流畅深入学习:
    http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
  3. 响应链
    UIApplication -> UIWindow -> UIViewController -> UIView -> sub view
    hitTest + pointInside:
    hitTest 方法底层会调用 pointInside;
    hitTest底层实现:
    {
    if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01)
    if(![self pointInside:point withEvent:event]) return nil;
    self.subviews[i] -> [self convertPoint:point toView:childV] -> [childV hitTest:childP withEvent:event];//有子视图返回子视图,没有的话自己在响应区返回自己;
    }
    touches处理:?
  4. NSTimer的深入了解
    timer本身会对目标对象有强引用,runloop对timer有强引用;
    timer不用了,一定要调动invalidate;
    对象有timer的时候,timer的invalidate不要在dealloc中处理,因为timer强引用对象,如果timer不释放,self也不会释放,相当于循环引用;
    调用performSelecter:afterDelay: 实际上是内部创建一个 Timer 并添加到当前线程的 RunLoop 中;所以如果当前线程没有 RunLoop,则这个方法会失效;(performSelector:onThread:创建Timer加入到对应的线程中);
  5. method swizzling
  6. 如何高性能给UIImageView加圆角
    corner radius 会发生离屏渲染,有性能问题
    正确的做法是切换到工作线程利用CoreGraphic API生成一个offscreen UIImage,再切换到main thread赋值给UIImageView
    使用CG绘制圆角
    使用 CAShapeLayer
  7. drawRect的用途
    drawRect会利用CPU生成offscreen bitmap,从而减轻GPU的绘制压力,用这种方式最UI可以将动画流畅性优化到极致,但缺点是绘制api复杂,offscreen cache增加内存开销。UI动画流畅性的优化主要平衡CPU和GPU的工作压力;
    https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5#.bct03ihv4
  8. loadView
    在视图显示之前创建子视图什么的
  9. viewWillLayoutSubView 的使用
    在布局需要刷新的时候调用, 被 [UIView(CALayoutDelegate) layoutSubLayersOfLayer:] 调用;
  10. 数据库读写
    sql的基本语法:
    inner join、left join、right join的区别是什么?
    使用coredata还是sqlite
    读写分线程吗
    遇到死锁?怎么解决死锁?
  11. 网络问题
    多个网络请求并发?
    网络请求如何提高性能?
    网络请求如何保证安全?
  12. base64与md5区别
    base64准确来说不是用来加密,只是将数据转换为只使用大写小写数字标点表示的字符串,易于显示处理,可解密;
    md5将数据生成一个无法逆向解密的散列值;
  13. 二叉搜索树
    概念,时间复杂度
    它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树;时间复杂度为O(log(n));
  14. KVC & KVO 深入理解
    KVO:系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法;

KVC:运用了一个isa-swizzling技术,isa-swizzing就是类型混合指针机制。KVC通过isa-swizzing实现其内部查找定位。isa指针(is kind of 的意思)指向维护分发表的对象的类,该分发表实际上包含了指向实现类中的方法的指针和其他数据。下面的例子能准确说明:

[site setValue:@"sitename" forKey:@"name"];
//会被编译器处理成
SEL sel = sel_get_uid(setValue:forKey);
IMP method = objc_msg_loopup(site->isa,sel);
method(site,sel,@"sitename",@"name");

  1. 动画的深入理解
  2. 绘图的深入理解
  3. 保持界面流畅的技巧
    http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
    https://robots.thoughtbot.com/designing-for-ios-graphics-performance
  4. 同步机制
    @synchronized, NSLock, pthread mutexes, and OSSpinLock
    http://perpendiculo.us/2009/09/synchronized-nslock-pthread-osspinlock-showdown-done-right/
  5. 内存缓存机制
    http://mrpeak.cn/blog/ios-cache/
    cache算法会影响整个app的表现
    cache有哪些策略:FIFO,LRU,LRU-2,2Q等;
  6. CPU & GPU 如何配合工作
  7. CoreAnimation
  8. CoreGraphic & OpenGLES
  9. 深入理解RunLoop
    参考:http://blog.ibireme.com/2015/05/18/runloop/
    RunLoop是不允许直接创建的,有 getcurrentloop 这样的函数获取;
    线程与RunLoop是一一对应的,销毁是在线程结束时;
    RunLoop 的核心就是一个 mach_msg() ,RunLoop 调用这个函数去接收消息,如果没有别人发送 port 消息过来,内核会将线程置于等待状态;
    RunLoop 启动前内部必须要有至少一个 Timer/Observer/Source,所以 AFNetworking 源码创建的线程中,在 [runLoop run] 之前先创建了一个新的 NSMachPort 添加进去了;
image.png

一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source/Timer/Observer。每次调用 RunLoop 的主函数时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode。如果需要切换 Mode,只能退出 Loop,再重新指定一个 Mode 进入。这样做主要是为了分隔开不同组的 Source/Timer/Observer,让其互不影响。

  1. 网络
  2. 数据持久化
  3. performSelector:onThread
    performSelector:onThread: 时,实际上其会创建一个 Timer 加到对应的线程去,同样的,如果对应线程没有 RunLoop 该方法也会失效。

问答

  1. 发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?
  2. 实现一个第三方控件,可以在任何时候出现在APP界面最上层?
  3. 实现一个最简单的点击拖拽功能?
    如果在手放开时,需要根据速度往前滑动呢?
  4. 如何提高一个应用程序的性能?
  5. 不同版本的APP,数据库结构变化了,如何处理?

PS:
知乎-如何面试iOS工程师
iOS中级面试题
一份有点难的iOS面试题

The End

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 2,545评论 0 20
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 4,131评论 2 19
  • 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...
    JonesCxy阅读 991评论 1 7
  • 自律的人一般都活的很自在 而总有一群懒惰拖延症的人们不停喊累 而我想要成为前者 所以在努力摆脱自己这后者的现...
    阿妮很乖阅读 306评论 0 0
  • 孙小本同学阅读 186评论 0 1