那些年我面试中遇到和看过的iOS面试问题(2)2016-6-20

 1)关于手机验证的问题,实现注册,如何做手机号码的验证 ,以及如何给手机发送验证码?
就是要求用户填写手机号码,填写完保存到数据库,然后随机生成一个注册码,再把注册码通过短信方式发送给用户,用户输入注册码,在数据库一匹配,匹配ok就注册成功

 2)使用高德SDK的流程
高 德地图 iOS SDK 是一套基于 iOS 5.1.1 及以上版本的地图应用程序开发接口。通过该接口,用户可使用高德地图数据和服务轻松构建功能丰富、交互性强的地图应用。地图 iOS SDK 不仅包含构建地图的基本接口,还提供了诸如本地搜索、路线规划、公交搜索以及坐标地址搜索等服务,用户可以根据自己的需要进行选择。高德地图 iOS SDK的服务是免费的,任何非盈利性网站均可使用。
使用高德SDK先申请Key,才能使用该服务。之后按照高德地图API,在工程中引入sdk,配置环境。最后显示地图,实现地图功能。

 3) 如何定位
Core Location是iOS SDK中一个提供设备位置的框架。可以使用三种技术来获取位置:GPS、蜂窝或WiFi。在这些技术中,GPS最为精准,如果有GPS硬件,Core Location将优先使用它。如果设备没有GPS硬件(如WiFi iPad)或使用GPS获取当前位置时失败,Core Location将退而求其次,选择使用蜂窝或WiFi。
Core Location的大多数功能是由位置管理器(CLLocationManager)提供的,可以使用位置管理器来指定位置更新的频率和精度,以及开始和停止接收这些更新。
首先在工程中引入Core Location头文件,然后实例化一个管理者实例对象,设置代理,开启定位。需要注意的是iOS8之后IOS的定位服务做了优化,若要使用定位服务,必须先获取用户的授权。定位成功之后通过代理方法返回用户位置信息。

 4) 如何放置大头针
大头针需要遵守MKAnnotation协议,必须实现CLLocationCoordinate2D定义的属性,标记地理位置。
(1)进入地图应用后,长按地图中需要标记的位置,即可放置大头针。
(2)放置大头针后,即可看到该位置的标记。
(3)点击该标记,即可进行查看该处的详细地址、路线规划及看街景地图,还可以创建新联系人等。

 5)不使用第三方,如何做下拉刷新,加载
UITableView 本身是一个UIScrollView,所以UITableView可以实现UIScrollView的代理方法。上拉和下拉刷新无非是 UIScrollView偏移到一定程度调用刷新方法。 实现- (void)scrollViewDidScroll:(UIScrollView*)scrollView代理方法即可。
http://www.open-open.com/lib/view/open1390609384992.html
http://doc.okbase.net/ZeroHour/archive/119346.html

UITableView是继承scrollview的,当你下拉结束的时候会走scrollview的回调,scrollViewDidEndDragging,然后在这个回调中,可以判断是否达到下拉的位置,然后做你该做的处理,比如刷新列表,加载数据等等。

 6)关于RunLoop是什么
Run Loop就是一个事件处理的循环,用来不停的调动工作以及处理输入事件。使用Run Loop的目的就是节省CPU效率,线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。
在RunLoop中,需要处理的事件分两类,一种是输入源,一种是定时器,定时器好理解就是那些需要定时执行的操作,输 入源分三类:performSelector源,基于端口(Mach port)的源,以及自定义的源。编程的时候可以添加自己的源。RunLoop还有一个观察者Observer的概念,可以往RunLoop中加入自己的 观察者以便监控着RunLoop的运行过程,CFRunLoop.h中定义了所有观察者的类型:
当需要和该线程进行交互的时候才会使用Runloop,每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后去run它。一般情况下我们是没有必要去启用线程的RunLoop的,除非你在一个单独的线程中需要长久的检测某个事件。
Runloop工作的特点:
    1> 当有事件发生时,Runloop会根据具体的事件类型通知应用程序作出响应;
    2> 当没有事件发生时,Runloop会进入休眠状态,从而达到省电的目的;
    3> 当事件再次发生时,Runloop会被重新唤醒,处理事件。

7)浅复制和深复制的区别
浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一 个内存资源,复制的只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背 了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了

两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

深浅拷贝前提是:是实现NSCopying或者NSMutableCopying协议。
浅拷贝只是复制对象本身,对象的属性和包含的对象不做复制。
深拷贝则对对象本身复制,同时对对象的属性也进行复制。
深浅拷贝的本质区别是对象或者对象属性的内存地址是否一样,一样则为浅拷贝,不一样则为深拷贝。
Foundation框架支持复制的类,默认是浅拷贝。其中对Foundation中不可变的对象进行copy时作用相当于retain。
而如果是mutablecopy时,无论对象是否可变,副本是可变的,并且实现了真正意义上的copy。如果对可变对象进行copy,
副本对象是不可变的,同样是真正意义上的copy。


 8)类别和类扩展的区别
category和extensions的不同在于 后者可以添加属性。另外后者添加的⽅方法是必须要实现的。 extensions可以认为是⼀一个私有的Category。关于这个地方的问题可以看一下上一篇介绍http://user.qzone.qq.com/173542387/blog/1466437894 ;

 9)OC中创建线程的方法是什么?如果在主线程中执行代码,方法是什么
线 程创建有三种方法:使用NSThread创建、使用 GCD的dispatch、使用子类化的 NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,如果想延时执行代码可以用 performSelector:onThread:withObject:waitUntilDone:
关于这一点还有一点是值得我添加的,这些线程使用比较常见的就是GCD和 NSOperation
什 么时候使用GCD什么时候使用 NSOperation要做好区分,大工程不需要太多线程处理的时候使用GCD就可以了,毕竟写一个线程队列,设置最大并发数比较的麻烦,但是相对写一个 大工程,那就需要使用 NSOperation了,因为大量的线程操作去写一个GCD是很麻烦的事情。

10)线程和进程的区别和联系
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程

11)readwrite,readonly,assign,retain,copy,nonatomic属性的作⽤
 @property是⼀一个属性访问声明,扩号内⽀支持以下⼏几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的⽅方法名
2,readwrite,readonly, 设置可供访问级别 2,assign,setter⽅方法直接赋值,不进⾏行任何retain操作,为了解决原类型与环循引⽤用问题 3,retain,setter⽅方法对参数进⾏行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter⽅方法进⾏行Copy操作,与retain处理流程⼀一样,先旧值release,再Copy出新的对象, retainCount为1。这是为了减少对上下⽂文的依赖⽽而引⼊入的机制。 copy是在你不希望a和b共享⼀一块内存时会使⽤用到。a和b各⾃自有⾃自⼰己的内存。
5,nonatomic,⾮非原⼦子性访问,不加同步,多线程并发访问会提⾼高性能。注意,如果不加此属性,则 默认是两个访问⽅方法都为原⼦子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。 atomic和nonatomic⽤用来决定编译器⽣生成的getter和setter是否为原⼦子操作。在多线程环境下,原⼦子操作 是必要的,否则有可能引起错 误的结果。

12)什么时候⽤用delegate,什么时候⽤用Notification?
delegate针对one-to-one关系,并且reciever可 以返回值 给sender,notification 可以针对one-to-one/many/none,reciever⽆无法返回值给sender.所以, delegate⽤用于sender希望接受到 reciever的某个功能反馈值,notification⽤用于通知多个object某个事 件。


转载于:https://my.oschina.net/rdqblogs/blog/698187

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值