经典面试题

1. 你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?
Objecitve-C的重要特性是Runtime(运行时),在#import <objc/runtime.h> 下能看到相关的方法,用过objc_getClass()和class_copyMethodList()获取过私有API;使用
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
代码交换两个方法,在写unit test时使用到。
 
2. 你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?
没实现过多线程的CoreData(待实践)
<!--more-->
 
3. Core开头的系列的内容。是否使用过CoreAnimation和CoreGraphics。UI框架和CA,CG框架的联系是什么?分别用CA和CG做过些什么动画或者图像上的内容。(有需要的话还可以涉及Quartz的一些内容)
UI框架的底层有CoreAnimation,CoreAnimation的底层有CoreGraphics。
UIKit |
------------ |
Core Animation |
Core Graphics |
Graphics Hardware|
使用CA做过menu菜单的展开收起(太逊了)
 
4. 是否使用过CoreText或者CoreImage等?如果使用过,请谈谈你使用CoreText或者CoreImage的体验。
CoreText可以解决复杂文字内容排版问题。CoreImage可以处理图片,为其添加各种效果。体验是很强大,挺复杂的。
 
5.NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?(虽然protocol和delegate这种东西面试已经面烂了…)
NSNotification是通知模式在iOS的实现,KVO的全称是键值观察(Key-value observing),其是基于KVC(key-value coding)的,KVC是一个通过属性名访问属性变量的机制。例如将Module层的变化,通知到多个Controller对象时,可以使用NSNotification;如果是只需要观察某个对象的某个属性,可以使用KVO。
对于委托模式,在设计模式中是对象适配器模式,其是delegate是指向某个对象的,这是一对一的关系,而在通知模式中,往往是一对多的关系。委托模式,从技术上可以现在改变delegate指向的对象,但不建议这样做,会让人迷惑,如果一个delegate对象不断改变,指向不同的对象。
 
6. 你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。
使用NSOperationQueue用来管理子类化的NSOperation对象,控制其线程并发数目。GCD和NSOperation都可以实现对线程的管理,区别是 NSOperation和NSOperationQueue是多线程的面向对象抽象。项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。
更详细的答案见我的这篇文章
 
7. 既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?如何避免循环引用?
使用block是要注意,若将block做函数参数时,需要把它放到最后,GCD是Grand Central Dispatch,是一个对线程开源类库,而Block是闭包,是能够读取其他函数内部变量的函数。更详细的答案见我的这篇文章
 
8. 您是否做过异步的网络处理和通讯方面的工作?如果有,能具体介绍一些实现策略么?
 
9. 对于Objective-C,你认为它最大的优点和最大的不足是什么?对于不足之处,现在有没有可用的方法绕过这些不足来实现需求。如果可以的话,你有没有考虑或者实践过重新实现OC的一些功能,如果有,具体会如何做?
最大的优点是它的运行时特性,不足是没有命名空间,对于命名冲突,可以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的命名冲突,可以使用link命令及flag解决冲突。
1.单例类NSNotificationCenter提供信息广播通知,它采用的是观察者模式的的通知机制(正确)
 
理解:NSNotificationCenter使用了KVO,即Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接收到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
 
 
2.判断:从通讯录数据库查询联系人数据,可通过ABAddressBookCopyArrayOfAllPeople和ABAddressBookCopyPeopleWithName函数来获得。
 
理解:从通讯录数据库查询联系人数据是无法使用SQL语句,只能通过ABAddressBookCopyArrayOfAllPeople、ABAddressBookCopyPeopleWithName来获得。ABAddressBookCopyArrayOfAllPeople函数是通过人名查询通讯录中的联系人,其中的name参数是查询的前缀关键字。
 
 
3.NSURLConnection类的同步请求方法是?(A)
 
A.+sendSynchronousRequest:returningResponse:error:
 
B.-initWithRequest:delegate:
 
C.-initWithRequest:delegate:startImmediately:
 
理解:B和C都是异步方法,需要设置delegate属性。
 
 
4.genstrings命名的基于语法:genstrings[-a] [-q] [-o]sourcefile (正确)
 
理解:下面是genstrings命名的基本语法:
genstrings [-a] [-q] [-o <outputDir>] sourcefile
 
其中参数:
 
-a:在存在的文件后面追加内容;
 
-q:关闭多个键值对的警告;
 
-o:指定输出目录
 
因此如果我们想输出到en.lproj目录,则代码如下:
 
genstrings -o en.lproj *.m
 
 
5.树形结构导航模式是在内容上有层次的,从上到下或者分类包含等关系。例如黑龙江包含哈尔滨的关系,哈尔滨又包含了道里区等。(正确)
 
理解:树形导航就是指的是从属关系。
 
 
6.NSXML框架中核心的是NSXMLParser和它的委托协议NSXMLParserDelegate,NSXMLParserDelegate常用的方法有哪些?(ABCDE)
 
A. parserDidStartDocument
 
B. parser:foundCharacters
 
C. parser:didStartElement:namespaceURI:qualifiedName:attributes
 
D. parser:didEndElement:namespaceURI:qulificedName
 
E. parserDidEndDocument
 
 
7.NSXMLParser构造方法有哪些?(ABC)
 
A. initWithContentsOfURL
 
B. initWithData
 
C. initWithStream
 
D. initWithContentsOfFile
 
 
8.判断是否为iPad设备语句是?(C)
 
A. if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){....}
 
B. if([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone){....}
 
C.  if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){....}
 
 
9.NSAssert类似的宏有哪些?(ABCD)
 
A. NSAssert1
 
B. NSAssert2
 
C.NSAssert3
 
D.NSAssert4
 
理解:查阅官方文档:NSAssert1,NSAssert2,NSAssert3,NSAssert4,NSAssert5
 
 
10.Objective-C有哪几种内存管理方法?(ABCD)、
 
A. MRR(Manual Retain Release)
 
B. MRC(Manual Reference Counting )
 
C.ARC(Automatic Reference Counting)
 
D.GC(Garbage Collection)
 
理解:MRR是MRC的官方名字;
 
MRC是手动引用计数;
 
ARC是自动引用计数;
 
GC是垃圾回收(在开发OS X中使用);
 
 
11. AddressBook框架中常用类?(ABCD)
 
A. ABAddressBook;
 
B. ABPerson;
 
C. ABGroup;
 
D. ABRecord;
 
 
12. AddressBookUI框架中的视图控制器?(ABCD)
 
A. ABPeoplePickerNavigationController;
 
B. ABPersonViewController;
 
C. ABNewPersonViewController;
 
D.ABUnknownPersonViewController;
 
 
13.创建联系人使用的函数有哪些?(ABCD)
 
A. ABPersonCreate
 
B. ABRecordSetValue
 
C. ABMultiValueCreateMutable
 
D. ABAddressBookSave
 
 
14.修改联系人使用的函数有哪些?(CD)
 
A. ABPersonCreate
 
B. ABRecordSetValue
 
C. ABAddressBookGetPersonWithRecordID
 
D. ABAddressBookAddRecord
 
 
15.AddressBook高级API是在AddressBookUI框架中定义的,它为我们访问通讯录数据提供了UI界面。该框架提供了哪些试图控制器和委托协议?
 
A. ABPeoplePickerNavigationController
 
B. ABPersonViewController
 
C. ABUnknownPersonViewController
 
D. ABNewPersonViewController
 
 
16.iOS中持久化方式有哪些?(ABCD)
 
A. 属性列表文件
 
B. 对象归档
 
C. SQLite数据库
 
D. CoreData
 
 
17.NSURL的构造函数有?(CD)
 
A. + requestWithURL:
 
B  - initWithURL:
 
C + URLWithString:
 
D  - initWithString:
 
 
18.表视图的相关类有哪些?(AB)
 
A. UITableView
 
B. UITableViewController
 
C. UITableViewDelegate
 
D.UITableViewDataSource
 
理解:注意CD是委托和数据源。
 
 
19.下面属于表视图内置的扩展视图常量如下?(ABCD)
 
A. UITableViewCellAccessoryNone
 
B. UITableViewCellAccessoryDiscloureIndicator
 
C. UITableViewCellAccessoryDetailDisclosureButton
 
D.UITableViewCellAccessoryCheckmark
 
 
20.下面与导航相关的试图控制器有那哪些?(BC)
 
A. UIViewController
 
B. UINavigationController
 
C. UITableBarController
 
D. UITableViewController
 
 
21.delegate中的property使用以下哪个属性?(A)
 
A. assign
 
B. retain
 
C. copy
 
D. strong
 
理解:assign防止循环引用;
 
 
22.关于Objective-C中属性的说明,错误的是(D)
 
A. readwrite是可读可写特性,需要生成getter方法和setter方法;
 
B. readonly是只读特性,只有getter方法,没有setter方法;
 
C.assign是赋值属性,setter方法将传入参数赋值给实例变量;
 
D.retain表示持有特性,copy属性表示拷贝属性,都会建立一个相同的对象;
 
理解:
 
copy是创建一个新对象。
 
retain是创建一个指针,引用对象计数+1.
 
copy属性表示两个对象内容相同,新的对象retain为1,与旧有对象的引用计数无关。旧有对象没有变化。copy减少对象对上下文的依赖。
 
retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容就是同一个内容,这个对象的retain+1。
 
也就是说,copy是内容拷贝,retain是内容拷贝。
 
 
23.下面对category类别描述不正确的是(B)
 
A.category可以添加新的方法;
 
B.category可以删除修改之前的方法;
 
C.将类的实现分散到多个不同文件或多个不同框架中;
 
D.创建对私有方法的前向引用;
 
理解:类别是一种为现有的类添加新方法的方式。利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(比如某些框架类),但不能删除修改之前的方法。
 
类别主要有3个作用:
 
(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。
 
(2)创建对私有方法的前向引用。如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错。这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会产生警告。
 
(3)向对象添加非正式协议:创建一个NSObject的类别成为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。
 
 
24.NSRunLoop的以下描述错误的是(C)
 
A. RunLoop并不是由系统自动控制的;
 
B.有3类对象可以被run loop监控:sources,timer,observers
 
C.线程是默认启动run loop的;
 
D.NSTimer可手动添加到新建的NSRunLoop中。
 
理解:
 
A:Runloop的作用在于当有事情要做时它使当前的thread工作,没有事情做时又使thread休眠。Runloop并不是由系统自动控制的,尤其是对那些新建的次线程需要对其进行显示的控制。
 
B:有三类对象可以被run loop监控,source,timer,observers。
 
C:每一个线程都有自己的runloop,主线程是默认开启的,创建的子线程是要手动开启的,因为NSApplication 只启动main application thread.
 
D:NSTimer默认添加到当前NSRunLoop中,也可以手动指定添加到自己新建的NSRunLoop中。
 
 
25.(判断)平铺导航模式是在内容组织上没有层次关系,展示的内容都放置在一个主屏幕上,采用分屏或分页控制器进行导航,可以左右或者上下滑动屏幕查看内容。(正确)
 
理解:平铺导航模式是指内容间没有从属关系,主要涉及的控件UIPageControl和UIScrollView。
 
 
26. UIPopoverController控制器的常用方法和属性(ABCD)
 
A. presentPopoverFromBarButtonItem:permittedArrowDirections:animated: 呈现Popover视图方法;
 
B.dismissPopoverAnimated:关闭Popover视图方法;
 
C.popoverVisible,判断Popover视图是否可见;
 
D.popoverArrawDirection,判断Popover视图箭头的方向;
 
理解:貌似UIPopoverController在iOS9之后被Deprecated了。
 
 
27.模态视图专用属性有哪些?(ABCD)
 
A. UIModalPresentationFullScreen,全屏状态,是默认呈现样式,iPhone只能全屏呈现。
 
B.UIModalPresentationPageSheet,它的宽度是固定的768点,在iPad竖屏情况下则全屏显示。
 
C.UIModalPresentationFormSheet,它的是固定的540*620点,无论是横屏还是竖屏情况下呈现尺寸都不会变化。
 
D.UIModalPresentationCurrentContext,它与父视图控制器有相同的呈现方式。
 
 
28.iOS单元测试框架有哪些?(ABC)
 
A. OCUnit
 
B. GHUnit
 
C. OCMock
 
D. NSXML
 
理解:OCUnit和XCTest都是官方的测试框架,OCUnit过时已经被XCTest取代。
 
GHUnit和OCMock都是第三方的测试框架。
 
 
29.NSURLRequest的构造函数有(ABCD)
 
A. +requestWithURL:
 
B. -initWithURL;
 
C. requestWithURL:cachePolicy:timeoutInterval;
 
D.initWithURL:cachePolicy:timeoutInterval;
 
 
30.iOS 应用导航模式有哪些?(ABC)
 
A.平铺导航模式;
 
B. 标签导航模式;
 
C.树形结构导航模式;
 
D.模态视图
 
 
31.在UIViewController类中与模态视图相关方法有哪些?(AB)
 
A. presentViewController:animated:completion:
 
B, dismissViewControllerAnimated:complation:
 
C.addChildViewController:
 
D.removeFromParentViewController.
 
 
32.iOS 中导航设计模式有几种?(ABC)
 
A. 平铺视图;
 
B. 标签视图;
 
C.树形视图;
 
D.模态视图导航;
 
理解:
 
平铺导航:UITabBarController
 
标签导航:UINavigationController
 
树形导航:UIPageViewController
 
 
33.实现多线程都有哪些方法(BC)
 
A. 使用@synchronized(self)
 
B. 使用GCD
 
C. 使用NSOperationQueue
 
D.使用@thread
 
 
34.为什么说OC是runtime language?(ABD)
 
A. 将数据类型的确定由编译时,推迟到了运行时;
 
B.运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法;
 
C.如果A继承了B,那么在编译时就已经生成了A的实例;
 
D.多态是指不同对象以自己的方式响应相同消息的能力;
 
 
常用的设计模式
• 单例模式
• 组合模式
• 观察者模式
• 代理模式
• 享元模式
• 工厂方法模式
• 抽象工厂模式
 
MVC的理解
• 数据管理者(M)、数据展示者(V)、数据加工者(C)
• M应该做的事:
○ 给ViewController提供数据
○ 给ViewController存储数据提供接口
○ 提供经过抽象的业务基本组件,供Controller调度
• C应该做的事:
○ 管理View Container的生命周期
○ 负责生成所有的View实例,并放入View Container
○ 监听来自View与业务有关的事件,通过与Model的合作,来完成对应事件的业务。
• V应该做的事:
○ 响应与业务无关的事件,并因此引发动画效果,点击反馈(如果合适的话,尽量还是放在View去做)等。
○ 界面元素表达
 
MVC 和 MVVM 的区别
• MVVM是对胖模型进行的拆分,其本质是给控制器减负,将一些弱业务逻辑放到VM中处理
• MVC是一切设计的基础,所有新的设计模式都是基于MVC进行的改进
• 补充:常见的设计模式有:MVC、MVCS、MVVM、viper
 
TCP和UDP有什么区别?
• TCP是面向连接的,建立连接需要经历三次握手,保证数据正确性和数据顺序
• UDP是非连接的协议,传送数据受生成速度,传输带宽等限制,可能造成丢包
• UDP一台服务端可以同时向多个客户端传输信息
• TCP报头体积更大,对系统资源要求更多
 
TCP的三次握手
• 第一次握手:客户端发送syn包到服务器,并进入syn_send状态,等待服务器进行确认;
• 第二次握手:服务器收到客户端的syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN + ACK包,此时服务器进入SYN_RECV状态;
• 第三次握手:客户收到服务器发送的SYN+ACK包之后,向服务器发送确认包,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成第三次握手。
 
如何制作一个静态库/动态库?他们的区别是什么?
• Xcode6支持制作静态库/动态库framework
• 无论是动态库还是静态库都是区分真机和模拟器的
• 静态库编译静态库文件装入程序空间,动态库是文件动态装入内存
• 动态库执行到相关函数才会被调用,节省空间
• 苹果一般不允许第三方动态库,APP容易被拒
- 一个lib包含了很多的架构,会打到最后的包里么?
• 不会,如果lib中有armv7, armv7s, arm64, i386,x86_64架构,而target architecture选择了armv7s,arm64,那么只会从lib中link指定的这两个架构的二进制代码,其他架构下的代码不会link到最终可执行文件中;反过来,一个lib需要在模拟器环境中正常link,也得包含i386架构的指令
 
每一个设备都有属于自己的CPU架构
每一个静态支持的架构是固定
模拟器
4s-->5 : i386
5s-->6plus : x86_64
真机
3gs-->4s : armv7
5/5c : armv7s,静态库只要支持了armv7,就可以跑在armv7s的架构上
5s-->6plus : arm64
 
常用命令总结:
 使用lipo -info命令,查看指定库支持的架构,比如UIKit框架
lipo -info UIKit.framework/UIKit
 想看的更详细的信息可以使用lipo -detailed_info
lipo -detailed_info UIKit.framework/UIKit
 还可以使用file命令
file UIKit.framework/UIKit
 合并MyLib-32.a和MyLib-64.a,可以使用lipo -create命令合并
lipo -create MyLib-32.a MyLib-64.a -output MyLib.a
 
支持64-bit后程序包会变大么?
• 会,支持64-bit后,多了一个arm64架构,理论上每个架构一套指令,但相比原来会大多少还不好说
用过Core Data 或者 SQLite吗?读写是分线程的吗?遇到过死锁没?如何解决的?
• 用过SQLite,使用FMDB框架
• 丢给FMDatabaseQueue 或者 添加互斥锁(NSLock/@synchronized(锁对象))
请简单的介绍下APNS发送系统消息的机制
• APNS优势:杜绝了类似安卓那种为了接受通知不停在后台唤醒程序保持长连接的行为,由iOS系统和APNS进行长连接替代
• APNS的原理:
○ 应用在通知中心注册,由iOS系统向APNS请求返回设备令牌(device Token)
○ 应用程序接收到设备令牌并发送给自己的后台服务器
○ 服务器把要推送的内容和设备发送给APNS
○ APNS根据设备令牌找到设备,再由iOS根据APPID把推送内容展示
不用中间变量,用两种方法交换A和B的值
• 方法1:
 
A = A + B
B = A - B
A = A - B
• 方法2:异或
 
A = A^B;
B = A^B;
A = A^B;
 
posted @ 2018-02-27 00:10  李建侯博客  阅读(419)  评论(0编辑  收藏  举报