几道iOS面试题


  1. delegate中的property使用以下哪个属性(A)
  • assign
  • retain
  • copy
  • strong
解析:

选 A ;避免循环引用!那么就要知道循环引用是怎么来的?比如,使用 tableview 的时候我们会设置他的 delete;可能一般情况下是你的 viewcontroller 对象;viewcontroller 持有着这个 tableview,如果 tableview 不使用 assign (arc 使用 weak) 的话,那么就造成了 tableview 持有viewcontroller,即 相互持有,最终结果是 viewcontroller 内存泄露,释放不掉了;这是一个很严重的问题!viewcontroller 是一个很大的对象!

B,D 是一个意思,都是持有(保留);copy的话就更不可能了,原因很简单, tableview 怎么知道他的delete 有没有实现 copying 协议呢!


  1. 关于Objective-C中属性的说明,以下错误的是(D)
  • readwrite是可读可写特性,需要生成getter方法和setter方法
  • readonly是只读特性,只有getter方法,没有setter方法
  • assign是赋值属性,setter方法将传入参数赋值给实例变量
  • retain表示持有特性,copy属性表示拷贝属性,都会建立一个相同的对象
解析:

Copy是创建一个新对象,Retain是创建一个指针,引用对象计数加1。

Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。

Retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝


  1. 下面对category描述不正确的是(B)
  • category可以添加新的方法
  • category可以删除修改之前的方法
  • 将类的实现分散到多个不同文件或多个不同框架中
  • 创建对私有方法的前向引用
解析:

类别是一种为现有的类添加新方法的方式。利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的 class 添加方法,包括那些没有源代码的类(如某些框架类),但不能删除修改之前的方法。

类别主要有3个作用:

(1)可以将类的实现分散 到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。

(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告

(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。


  1. NSRunLoop的以下描述错误的是(C)
  • Runloop并不是由系统自动控制的
  • 有3类对象可以被run loop监控:sources,timers,observers
  • 线程是默认启动run loop的
  • NSTimer可手动添加到新建的NSRunLoop中
解析:

A:Runloop的作用在于当有事情要做时它使当前的thread工作,没有事情做时又使thread 休眠sleep。Runloop并不是由系统自动控制的,尤其是对那些新建的次线程需要对其进行显示的控制。

B:有3类对象可以被run loop监控:sources、timers、observers。当这些对象需要处理的时候,为了接收回调,首先必须通过 CFRunLoopAddSource ,CFRunLoopAddTimer 或者 CFRunLoopAddObserver 把这些对象放入run loop。 要停止接收它的回调,可以通过CFRunLoopRemoveSource从run loop中移除某个对象。

C:每一个线程都有自己的runloop, 主线程是默认开启的,创建的子线程要手动开启,因为NSApplication 只启动main applicaiton thread。

D:NSTimer默认添加到当前NSRunLoop中,也可以手动制定添加到自己新建的NSRunLoop的中。


  1. 单例类NSNotificationCenter提供信息广播通知,它采用的是观察者模式的通知机制。(对)
  • 解析:NSNotificationCenter监听通知是KVO

  1. 判断:从通讯录数据库查询联系人数据,可通过ABAddressBookCopyArrayOfAllPeople和ABAddressBookCopyPeopleWithName函数获得。(对)
  • 解析: 从通信录数据库查询联系人数据是无法使用SQL语句,只能通过ABAddressBookCopyArrayOfAllPeople和ABAddressBookCopyPeopleWithName函数获得.
    ABAddressBookCopyArrayOfAllPeople函数是查询所有的联系人数据。ABAddressBookCopyPeopleWithName函数是通过人名查询通讯录中的联系人,其中的name参数就是查询的前缀关键字。

  1. NSURLConnection类的同步请求方法是?(A)
  • +sendSynchronousRequest:returningResponse:error:
  • –initWithRequest:delegate:
  • –initWithRequest:delegate: startImmediately:
解析:

B和C都是异步方法,需要设置delegate属性。


  1. genstrings命名的基本语法:genstrings [-a] [-q] [-o] sourcefile(对)
解析:

下面是genstrings命名的基本语法:

genstrings [-a] [-q] [-o ] sourcefile

其中参数:

-a 在存在的文件后面追加内容

-q 关闭多个键/值对的警告

-o 指定输出目录

因此如果我们想输出到en.lproj目录,则代码如下:

genstrings -o en.lproj *.m


  1. 下面哪些属于UITableViewDelegate协议的方法?
解析:

代理的作用是用来完成指定的某种动作,所以必须是动作性的操作而不是数据性的操作


  1. 平铺导航模式是在内容组织上没有层次关系,展示的内容都放置在一个主屏幕上,采用分屏或分页控制器进行导航,可以左右或者上下滑动屏幕查看内容。(对)
解析:

A,平铺导航模式是指内容间没有从属关系,主要涉及的控件UIPageControl和UIScrollView.因此A答案正确


  1. UIPopoverController控制器的常用方法和属性?(ABCD)
  • presentPopoverFromBarButtonItem:permittedArrowDirections:animated:呈现Popover视图方法
  • dismissPopoverAnimated: 关闭Popover视图方法
  • popoverVisible,判断Popover视图是否可见
  • popoverArrowDirection,判断Popover视图箭头的方向
解析:

abcd都对,但这个类在9.0之后被Deprecated 了


  1. 模态视图专用属性有哪些?(ABCD)
  • UIModalPresentationFullScreen,全屏状态,是默认呈现样式,iPhone只能全屏呈现。
  • UIModalPresentationPageSheet,它的宽度是固定的768点,在iPad竖屏情况下则全屏呈现。
  • UIModalPresentationFormSheet,它的是固定的540x620点,无论是横屏还是竖屏情况下呈现尺寸都不会变化。
  • UIModalPresentationCurrentContext,它与父视图控制器有相同的呈现方式。

  1. iOS单元测试框架有哪些?(ABC)
  • OCUnit
  • GHUnit
  • OCMock
  • NSXML
解析:

OCUnit和XCTest都是官方的测试框架,OCUnit已经过时被XCTest所取代。

GHUnit和OCMock都是第三方的测试框架,其官方地址分别为:https://github.com/gh-unit/gh-unit,https://github.com/erikdoe/ocmock


  1. NSURLConnectionDelegate协议中的方法有哪些?(ABD)
  • connection:didReceiveData:
  • connection:didFailWithError:
  • initWithRequest:delegate:
  • connectionDidFinishLoading:
解析:

单 看 NSURLConnectionDelegate ,答案只有 B ,而 A 和 D 属于 NSURLConnectionDataDelegate 。

仔 细 看 NSURLConnectionDataDelegate 的声明:

@protocol NSURLConnectionDataDelegate
可以知道 A 和 D 也正确

  1. NSURLRequest的构造函数有?(ABCD)
  • +requestWithURL:
  • –initWithURL:
  • +requestWithURL:cachePolicy:timeoutInterval:
  • –initWithURL:cachePolicy:timeoutInterval:
解析:

ac-构造函数
bd-初始化函数
构造函数就是初始化函数


  1. iOS应用导航模式有哪些?(ABC)
  • 平铺导航模式
  • 标签导航模式
  • 树形结构导航模式
  • 模态视图
解析:

A:平铺模式,一般由scrollView和pageControl组合而成的展示方式。手机自带的天气比较典型。
B:标签模式,tabBar的展示方式,这个比较常见。
C:树状模式,tableView的多态展示方式,常见的9宫格、系统自带的邮箱等展现方式。

A平铺 UIPagecontroller B标签 UITabBarcontroller C 树形 UINavigationcontroller


  1. 使用genstring工具可以扫描的宏是有哪些?(全选)
  • CFCopyLocalizedString
  • CFCopyLocalizedStringFromTable
  • CFCopyLocalizedStringFromTableInBundle
  • CFCopyLocalizedStringWithDefaultValue
  • NSLocalizedString
  • NSLocalizedStringFromTable
  • NSLocalizedStringFromTableInBundle
  • NSLocalizedStringWithDefaultValue
解析:

详细的解释可以看一下这篇博客,其实只要自己用一下genstrings并且看看那几个宏是怎么回事就理解了。
http://blog.csdn.net/abc649395594/article/details/49934117

个人:其实这道题看到有local我都会选,因为应该都是涉及到本地化。


  1. 在UIViewController类中与模态相关方法有哪些?(AB)
  • presentViewController:animated:completion:
  • dismissViewControllerAnimated:completion:
  • addChildViewController:
  • removeFromParentViewController
解析:AB,模态:视图切换

  1. iOS中导航设计模式有几种?(ABC)
  • 平铺导航
  • 标签导航
  • 树形导航
  • 模态视图导航
解析:

A B C

我们经常会遇到在某个路径中滑出一个单屏、进行编辑、查看信息、操作界面的上的内容的情况发生。这是一种应用行为的特定形态,一般带有流程的界面变更的情况发生,比如一张页面临时取代了整个应用程序的显示屏,我们称这种处理方式为“模态视图”。默认情况下,模式视图从屏幕底部边缘滑上来切一半覆盖了当前整个屏幕,模态视图完成和程序主功能有关系的独立任务,尤其适合于主功能界面中欠缺的多级子任务。这种操作会暂时绕开应用的正常操作。

模态视图常常被用来编辑或添加内容,当你需要的时候模态视图一般从屏幕底部滑出而后遮盖先前的页面,当你完成任务后滑出的页面也会相应的缩回去,然后可以继续之前的流程。有些控件和界面元素只在次要任务中被偶尔用到,模态视图很好的把他们暂时隐藏了,并且当需要的时候出现,有效的节约了屏幕空间。

模态视图有点像是导航中的死胡同,为了能够让用户也可以同样方便的回到正常的流程中去,模态视图除了正常的操作之外一般还有加上一个“完成”按钮,或者“取消”按钮。