iOS面试题-每日十道-第十天

有误的地方 欢迎高手能给指出

一. 运行时你是怎么理解的,怎么用

ObjC Runtime 其实是一个 Runtime 库,基本上用 C 和汇编写的,这个库使得 C 语言有了面向对象的能力。这个库做的事情就是加载类的信息,进行方法的分发和转发之类的。OC是一种面向runtime(运行时)的语言,也就是说,它会尽可能地把代码执行的决策从编译和链接的时候推迟到运行时。这给程序员写代码带来很大的灵活性,比如说你可以把消息转发给你想要的对象,或者随意交换一个方法的实现之类的。这就要求runtime能检测一个对象是否能对一个方法进行响应,然后再把这个方法分发到对应的对象去。我们拿 C 来跟 ObjC 对比一下。在 C 语言里面,一切从 main 函数开始,程序员写代码的时候是自上而下地,一个 C 的结构体或者说类吧,是不能把方法调用转发给其他对象的。这个问题其实涉及到两个概念,运行时和多态。 简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。 多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。 也就是不同的对象以自己的方式响应了相同的消息 响应了eat这个选择器。因此也可以说,运行时机制是多态的基础。比如KVO中我们就用了。

二. 你单例怎么理解怎么用的?

单例设计模式,一个类只有一个实例,而且该实例易于外界访问,方便对实例个数的控制并节约系统资源。类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。在程序中,我需要一系列的对象,他们每一个内部都包含有一组变量和功能,是静态的,而且整个程序都只需要拥有一个该类的对象。例如:
1.登陆界面(点击多个地方都弹出相同的控制器);
2.管理数据库;
3.音效控制;
4.文件处理:
5.封装网络工具类等等...

三. 说说oc这门语言吧,和c \ c++比,你觉得哪个效率高,高到哪里了?

object_c比C++稍慢,是因为object_c的一些语言特性,比如反射,影响了执行效率。区别主要有以下一些方面。

  • 单一继承:Objective-C不支持多重继承,(同Java和Smalltalk),而C++语言支持多重继承。
  • 动态:Objective-C是动态定型(dynamicaly typed)所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。C++ 跟从面向对象编程里的Simula67(一种早期OO语言)学派,而Objecive-C属于Smalltalk学派。
    在C++里,对象的静态类型决定你是否可以发送消息给它,而对Objecive-C来说,由动态类型来决定。Simula 67学派更安全,因为大部分错误可以在编译时查出。而Smalltalk学派更灵活,比如一些Smalltalk看来无误的程序拿到Simualr 67那里就无法通过。从很多方面来看,C++和Objective-C的差别,与其说时技术上的,不如说是思维方式上的...

四. 代理,通知,KVO 各有什么优缺点

代理优势:
1.语法严格,将要监听的事件必须是delegate协议中有清晰的定义
2.如果delegate中的一个方法没有实现那么就会出现编译警告/错误
3.在一个应用中的控制流程是可跟踪的并且是可识别的;
4.在一个控制器中可以定义定义多个不同的协议,每个协议有不同的delegate
5.没有第三方对象要求保持/监视通信过程。
代理缺点
1.需要编写很多代码.

  1. 定义delegate属性时,需要注意strong\weak的问题.
    3.一般用于父子关系,层级结构不能太复杂.

通知优点
1.不需要编写太多代码,实现比较简单.
2.对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单.
3.controller能够传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
4.层级结构比较深的时候用.
通知缺点
1.在编译期不会检查通知是否能够被观察者正确的处理;
2.在释放注册的对象时,需要在通知中心取消注册;
3.在调试的时候应用的工作以及控制过程难跟踪;
4.观察者需要提前知道通知名称.
5.通知发出后,controller不能从观察者获得任何的反馈信息。

KVO优点
1.能够提供一种简单的方法实现两个对象间的同步。
2.能够对非我们创建的对象,即内部对象的状态改变作出响应.
KVO缺点
1.我们观察的属性必须使用strings来定义。因此在编译器不会出现警告以及检查;
2.它只能用来对属性作出反应,而不会用来对方法或者动作作出反应.
3.需要手动移除观察者。

五. 怎么实现在一个线程中同时执行两个任务?

怎么都做不到

六. BASE64的用法?

BASE64是网络传输中最常用的编码格式 - 用来将二进制的数据编码成字符串的编码方式.
1> 能够编码,能够解码.
2> 被很多的加密算法作为基础算法.

七. 什么是消息推送

可以绕过运营商,通过标准TCP/IP网络直接向这些手机发送消息.这些消息就称为推送消息.推送消息是通过Apple和Google掌控的互联网服务器发送的.推送消息从根本上就是设计用于与应用程序通信的.它们可以发送文本,多媒体文件和特定于应用程序的数据,例如警告声音和显示在应用程序图标上的标记等.

八. 使用coredata有哪几种持久化存储机制

  • 属性列表
  • 对象归档
  • 数据库存储

九. 协议是什么 有什么作用

一系列方法的声明,某个类遵守了某个协议就拥有了该协议的所有方法的声明.就必须实现协议中规定的@require的方法.

十.类变量的@protected, @private,@public, @package声明各有什么含义

  • @public本类\子类\在其他类中都能访问
  • @protected本类\子类中访问
  • @private 私有的,只有本类中能访问
  • @package 本包内使用,跨包不可以.

纯手动 有地方是个人理解 有误的地方希望大家能给指出 谢谢
大家面试中遇到的问题 也可以留言分享
如果您喜欢 或者对您有点帮助 希望点一下喜欢 谢谢了~~

你可能感兴趣的:(iOS面试题-每日十道-第十天)