iOS面试题

来源:互联网 发布:saber大邪神手办淘宝 编辑:程序博客网 时间:2024/05/16 01:49

1、Objective-C 的类可以多重继承吗?可以实现多个接口吗?Category是什么?重写一个类的方法是用继承好还是分类好?为什么?

 答案:Objective-C 的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承; Category是类别,一般情况用分类好,用Category去重写类的方法,仅对Category有效,不会影响到其它类与原有类的关系。

2、 #import跟#include有什么区别,@class呢?#import<>跟#import""又有什么区别?

答案:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#progmaonce;@class告诉编译器某个类的声明,当执行时,才会去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import""用来包含用户的头文件。

3、id声明的对象有什么特性?

答案:id声明的对象具有运行时特性,即可以指向任意类型的Objective-C的对象。

4、原子(atomic)跟非原子(nonatomic)属性有什么区别?

答案:1、atomic:提供多线程安全,是防止在写未完成的时候被另外一个线程读取,造成数据错误;

             2、nonatomic:在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。

5、内存管理的几条原则,按照默认法则,哪些关键字生成的对象?

答案:需要手动释放?在property结合的时候怎样有效的避免内存泄露?

            谁申请,谁释放;

           遵循 Cocoa Touch 的使用原则:

           内存管理主要要避免“过早释放”和“内存泄露”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄露”,一定要申请了要负责释放,要细心。  关键字alloc或new生成的对象需要手动释放;设置正确的property属性,对于retain需要在合适的地方释放。

6、iOS程序都能获取到系统的什么?

答案:(1)手机序列号;(2)手机别名/用户自定义的名称;(3)设备名称;(4)手机系统版本;(5)手机型号;(6)地方型号/国际化区域名称;(7)当前应用名称;(8)当前应用软件版本;(9)当前应用版本号码;(10)当前系统时间;(11)当前屏幕尺寸;(12)获得手机当前电量。

7、怎样实现推送服务?

答案:推送服务要实现是几个方面:(1)完成推送功能的注册请求,即在程序启动时弹出是否使用推送功能;(2)实现的程序启动是通过推送消息窗口触发的,在这里可以处理推送内容;(3)接收从苹果服务器返回的唯一的设备token,该token是推送服务器发送推送消息的依据,所以需要发送回推送服务器保存;(4)接收到推送消息,解析处理。

8、HTTP协议的主要特点是什么?

答案:HTTP协议是短连接,都是客户端主动发送请求,服务器做出响应,服务器响应之后,链接则断开(1)支持客户/服务器模式;(2)简单快速:客户向服务器请求服务时,只需要传送请求方法和路径。请求方法常有的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;(3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。(4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。(5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要面对的信息,则它必须重传,这样可能导致每次连接传送的数量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

9、HTTP协议中的GET请求与POST请求的区别?

答案;(1)GET请求没有请求体,POST请求有请求体,请求参数可以放入请求体中,所以POST可以提交大量的数据给服务器。(2)Get请求直接从服务器拿数据,性能好,效率高,在地址栏会显示所有的参数,从直观上安全性不高,由于Get不提交数据给服务器,因此实际上的安全性是很高的,实际应用:数据查询;Post请求,需要先弄一个数据体,将数据体提交给服务器,才能获取到服务器的响应,性能不好,效率低,不会再地址栏显示参数,直观上安全性高,由于Post请求会提交数据给服务器,有可能会存在安全漏洞,实际的安全性不高,实际应用:用户登录、上传文件等需要与服务器进行数据交互的操作,才需要使用到Post操作。

10、frame与bounds的区别

答案:(1)frame指的是:该view在父view坐标系统中的位置和大小(参照点是父试图的坐标系统);(2)bounds指的是:该view在本身坐标系统中的位置和大小(参照点是本身的坐标系统)。

11、如何理解MVC设计模式?

答案:MVC是一种架构设计;M表示业务模型,V表示用户界面,C表示控制器,使用MVC的目的是将数据和试图的实现代码分离,从而使同一个程序可以使用不同的表现形式;比如一批统计数据可以分别用柱状图、饼图来表示;C存在的目的则是确保数据和试图的同步,一旦数据改变,试图应该同步更新。

12、怎样检测socket是不是断开了?

答案:判断socket api 返回值并结合GetLastError来确定(心跳包,socket机制)。 

13、按顺序发送出去的数据包,在接收时顺序乱了,是什么原因导致的?

答案:每个包经过的路由器是不同的,会造成到达时间的不同。 对于UDP,这种现象很常见,可以加索引,然后接收端设置缓存接收,按索引取

14、如果发送100K的数据,第一次发送了50K,然后不能发送了,剩下的50K怎么办?

答案:改成非阻塞模式,并循环发要么就是下次有机会重发,要么就是放弃这次发送、后面的50K发不了,说明前面的50K发出去没收到应答,即前面的都还没发成功,所以只能等,等的结果是超时或等了一段时间后等到了应答,前者全部重发,后者正常发.、如果SOCKET出错,那么后面50K就不发了,释放资源,关闭SOCKET。

15、控制器的loadView方法是什么时候调用的,viewWillApear什么时候调用的?

答案:(1)loadView调用:当控制器的跟试图view为空,且此view被访问时则调用;(2)viewWillApear调用:当控制器试图view被添加到父试图上时调用。

16、写一个NSString类的实现。

答案:+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

+ (id)stringWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding

{

  NSString * obj;

  obj = [self allocWithZone:NSDefaultMallocZone()];

  obj = [obj initWithCString:nullTerminatedCString  encoding:encoding];

  return AUTORELEASE(obj);

}

17、static关键字的作用。

答案:(1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区);

             (2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量;

             (3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,那就是这个函数被限制在声明它的模块的本地范围内使用。

18、写一个单例的实现

答案:(1) GCD

             static InstanceClass * instance;

              + (InstanceClass *)defaultInstance {

                        static dispatch_once_t onceToken;

                        dispatch_once(&onceToken,^{

                                 instance = [[InstanceClass alloc] init];

                       });

                       return instance; }

           (2) @synchronized

             static InstanceClass * instance;

              + (InstanceClass *)defaultInstance {

                            @synchronized(self){

                                   if(instance == nil){

                                                instance = [[InstanceClass alloc] init];

                                   }

                           }

                       return instance; }


19、关于多态,数组的懒加载

20、解释nil、Nil、id

21、请描述类别的局限性和作用

22、写一个block函数的方法

答案:

  1. int result = ^(int a){return a*a;}(5);  
  2. NSLog(@"%d", result);  

23、你所熟知的动画类

24、阐述你对HTTP的了解程度

25、当一个视图控制器被创建,代码的执行顺序

答案:(1)init(initWithNibName)初始化对象,初始化数据;(2)loadView;(3)viewDidLoad加载完成,载入该方法;(4)viewWillAppear试图将出现在屏幕之前,马上这个试图就会被展现在屏幕上了;(5)viewDidAppear试图已经在屏幕上渲染完成当一个试图被移除屏幕冰洁销毁的时候的执行顺序,这个顺序和上面的相反(1)viewWillDisappear试图将被从屏幕上移除之前执行;(2)viewDidDisappear试图已经从屏幕上移除,用户看不到这个试图了;(3)dealloc试图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

0 0
原创粉丝点击