转载请注明出处:http://ohno.com.cn/index.php/archives/67/
http://www.jianshu.com/p/d72c4b595c7b

Objcetive-C与基础知识

1. #define和const定义的变量,有什么区别

2. 什么是ARC?它的原理是什么?

ARC(Automatic Reference Counting)是iOS5引入的。编译器会自动在适当的地方插入适当的retainreleaseautorelease语句。注意ARC是编译器特性,而不是iOS运行时特性(除了weak指针系统),它也不是其它语言中的垃圾收集器。

3. unsafe_unretained, assign, weak, strong, copy, retain

  • unsafe_unretained:用于iOS5以前的版本,是不安全的修饰符,在对象设置为nil后再使用会出现Crash(野指针);
  • assign:赋值特性;用于修饰基础数据类型(例如NSInteger)和C数据类型(int,float,double,char,等),MRC中也用于修饰弱引用对象,后被weak取代;
  • weak:用于iOS5及以后版本中,是代替unsafe_unretained是修饰符
  • strong:持有特性;与retain功能相同,会使引用记数+1;
  • copy:赋值特性;setter方法会将传入对象复制一份再赋值,新对象引用计数为1,此属性只对实现NSCopying协议的对象类型有效;
  • retain:持有特性;setter方法将传入参数先保留再赋值,传入参数引用计数+1。

4. __block vs __weak

  • __block修饰符的对象在block中是可以被修改、重新赋值的,在block中不会被block强引用一次,从而不会出现循环引用问题。
  • __weak修饰符的对象,作用等同于定义为weakproperty。当原对象没有任何强引用的时候,弱引用指针也会被设置为nil

区别:

  • __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
  • __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
  • __block对象可以在block中被重新赋值,__weak不可以。
    PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。

摘自(http://www.bubuko.com/infodetail-782508.html)

5. __block在ARC和MRC下含义一样吗?

了解__block:http://chun.tips/blog/2014/11/13/hei-mu-bei-hou-de-blockxiu-shi-fu/

6. block中的[weak self]是任何时候都需要加的么?

  • 当仅只有self持有block或block持有self时,不需要加,如数组枚举block;
  • 当在block内部设置断开持有关系或手动释放一方(block赋值nil)时,不需要加;

参考:http://www.zhihu.com/question/34593410

7. 使用atomic一定是线程安全的吗?

  • atomic属性是为了保证程序在多线程情况下,编译器会自动生成互斥加锁代码,避免该变量的读写不同步问题,所以在对于setter/getter方法中是安全的,但它也仅限于setter/getter时的线程安全,对于如NSMutableArray容器类,它的读写是不是线程安全的,这与setter/getter无关了。

8. 内存中的栈和堆的区别是什么?那些数据在栈上,哪些在堆上?

  • 管理方式:堆由程序员管理;栈由编译器自动管理;
  • 大小:堆是向高地址扩展的数据结构(不连续);栈是向低地址扩展的数据结构(连续);
  • 碎片:堆容易造成碎片;
  • 分配:堆是动态分配(人工释放);栈可静态分配和动态分配(自动释放);
  • 效率:栈比堆效率高。

通常是局部变量、函数参数等存放在栈中;

9. 什么情况下会出现内存的循环引用(retain cycle)。

  • 常见出现场景:NSTimerblockdelegate
  • NSTimer在释放target前需先调用invalidate使用之失效,再释放target便可;
  • block使用需要调用前引入__weak,使之不持有发送对象,在此过程中避免形成保留环,在进入block体内后对发送对象强引用__strong,保证在block执行过程中发送对象不被释放或形成野指针;
  • delegate如使用强引用修饰符,可能会使两对象互相持有对方,使之形成保留环,通常使用weak来修饰delegate来避免。

参考:http://www.cocoachina.com/ios/20150104/10826.html

10. 为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)

  • [receiver message]会被编译器转化为:objc_msgSend(receiver, selector),如果消息含有参数,则为:objc_msgSend(receiver, selector, arg1, arg2, ...)

  • 如果消息的接收者能够找到对应的selector,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。

  • Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。可以使用runtime的一系列方法实现。

  • object发送消息时,Runtime库会根据objectisa指针找到这个实例object所属于的类,然后在类的方法列表以及父类方法列表寻找对应的方法运行。id是一个objc_object结构类型的指针,这个类型的对象能够转换成任何一种对象。

      消息发送步骤:
      1.检测这个 selector 是不是要忽略的。比如 Mac OS X 开发,有了垃圾回收就不理会 retain,release 这些函数了。
      2.检测这个 target 是不是 nil 对象。ObjC 的特性是允许对一个 nil 对象执行任何一个方法不会 Crash,因为会被忽略掉。
      3.如果上面两个都过了,那就开始查找这个类的 IMP,先从 cache 里面找,完了 找得到就跳到对应的函数去执行。
      4.如果 cache 找不到就找一下方法分发表。
      5.如果分发表找不到就到超类的分发表去找,一直找,直到找到NSObject类为止。
      6.如果还找不到就要开始进入动态方法解析了,后面会提到。
     后面还有:
      动态方法解析 resolveThisMethodDynamically
      消息转发 forwardingTargetForSelector
    

摘自:http://www.jianshu.com/p/620022378e97

11. 讲述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理 ?

  • 动态方法解析 resolveThisMethodDynamically
  • 消息转发 forwardingTargetForSelector

参考:http://www.cnblogs.com/biosli/p/NSObject_inherit_2.html

12. 什么是method swizzling?

  • Method swizzling指的是改变一个已存在的选择器对应的实现的过程,它依赖于Objectvie-C中方法的调用能够在运行时进改变——通过改变类的调度表(dispatch table)中选择器到最终函数间的映射关系。

摘自:http://www.cocoachina.com/industry/20140225/7880.html

13. +(void)load; +(void)initialize;有什么用处?

参考:http://www.cocoachina.com/ios/20150104/10826.html

14. GCD里面有哪几种Queue?你自己建立过串行queue吗?背后的线程模型是什么样的?

参考:http://www.cocoachina.com/industry/20131210/7506_2.html
http://blog.csdn.net/crycheng/article/details/22214617

15. GCD的queue,main queue中执行的代码,一定是在main thread么?

16. NSOperationQueue有哪些使用方式

17. NSThread中的Runloop的作用,如何使用?

表现层

18. UIView和CALayer是啥关系?

19. loadView是干嘛用的?

20. viewWillLayoutSubView你总是知道的。。

21. 使用drawRect有什么影响?

22. 如何高性能的给UIImageView加个圆角

23. 讲讲你用Instrument优化动画性能的经历;

24. 系统如何寻找到需要响应用户操作的那个Responder

25. 多屏幕尺寸的适配

26. push view controller 和 present view controller的区别

27. 描述下tableview cell的重用机制

逻辑层

29. ASIHttpRequest或者SDWebImage里面给UIImageView加载图片的逻辑是什么样的?(把UIImageView放到UITableViewCell里面问更赞)

30. 麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)

数据持久层

31. 数据持久化存储方案有哪些?

32. 沙盒的目录结构是怎样的?各自一般用于什么场合?

33. SQL语句问题:inner join、left join、right join的区别是什么?

34. sqlite的优化

35. 网络通信用过哪些方式(100%的人说了AFNetworking...)

36. 如何处理多个网络请求并发的情况

37. 在网络请求中如何提高性能

38. 在网络请求中如何保证安全性

39. 用过coredata或者sqlite吗?读写是分线程的吗?遇到过死锁没?咋解决的?

40. MD5和Base64的区别是什么,各自场景是什么?

41. TCP和UDP的区别是什么?

42. 二叉搜索树的概念,时间复杂度多少?

43. 什么是Binary search tree? search的时间复杂度是多少?

44. http的post和get啥区别?

架构

45. 哪些类不适合使用单例模式?即使他们在周期中只会出现一次。

46. Notification的使用场景是什么?同步还是异步?

47. 简单介绍一下KVC和KVO,他们都可以应用在哪些场景?

APP相关

48. 如何添加一个自定义字体到工程中

49. 如何制作一个静态库/动态库,他们的区别是什么?

50. Configuration中,debug和release的区别是什么?

51. 简单介绍下发送系统消息的机制(APNS)

实践

52. 发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?

53. 实现一个第三方控件,可以在任何时候出现在APP界面最上层

54. 实现一个最简单的点击拖拽功能。

55. 上面那个拖拽之外,如果在手放开时,需要根据速度往前滑动呢?

56. 如何减小一个应用程序的尺寸?

57. 如何提高一个性用程序的性能?

58. 不同版本的APP,数据库结构变化了,如何处理?

以上问题整理来自http://www.zhihu.com/question/19604641