iOS面试

IOS面试题

2018-11-15  本文已影响59人  创_1079

01。swift和oc的区别

1)swift没有地址和指针的概念

2)swift对数据类型要求极为严谨,不会做隐式转换

3)泛型,泛型代码能写出更加灵活清晰、可重复使用的函数

4)swift的构造函数可以重载,oc代替方式为initWithXXXX

swift的优势:

语法简洁,报错明显,成员定义简单,变量用var,常量用let,

2 属性和成员变量

1.属性

用 @property  修饰

自动生成getter 和 setter 方法 直接可以用点语法访问 有原子属性和非原子属性

2.成员变量

成员变量 无论在 .h 和  .m文件中  用大括号 扣起来,在里面写,不能直接用点语法进行访问

3int和nsinteger的区别

NSInteger与int的区别是NSInteger会根据系统的位数(32or64)自动选择int的最大数值(int or long)。

4、import和include

inport是ios的导入文件的方式 include是C和C++倒入的当时

class是包含类的声明,在初始的时候不会包含内容

5对象和类

分类,拓展,继承的区别:

分类:分类是在现有类的基础上添加新的方法,利用object-c的动态分配机制,可为现有类添加新方法,可以在分类中添加方法和成员变量,但是添加的成员不会自动生成setter和getter方法,需要在实现部分给出实现。

拓展:是分类的特例,可以添加属性和方法,名字要一致

继承:子类可以使用父类的方法和变量,当子类相对本类或者父类的变量进行初始化, 那么久需要重写init()方法,父类也可以访问子类的方法和变量

6.NSCache & NSDcitionary

NSCache与可变集合有几点不同:

NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存。如果其它应用需要内存时,系统自动执行这些策略。当调用这些策略时,会从缓存中删除一些对象,以最大限度减少内存的占用。

NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。

不像NSMutableDictionary对象,一个缓存对象不会拷贝key对象。

NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容。

(1)可以存储(当然是使用内存)

(2)保持强应用, 无视垃圾回收. =>这一点同 NSMutableDictionary

(3)有固定客户.

7。POST和GET

1.get是从服务器获取数据,post是向服务器传输数据

2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过 HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

5.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

8.原子(atomic)跟非原子(non-atomic)属性有什么区别?

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

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

9.mvc的设计模式是什么,你还熟悉什么设计模式

mvc设计模式:模型。视图,控制器,可以将整个应用程序在思想上分成三大块,对应的数据的存储或处理,前台的显示,业务逻辑的控制,iphone本身的设计思想是遵循mvc设计模式。

其他常用的设计模式:代理模式,单例模式,观察者模式,工厂模式

10.KVO和KVC

KVC:键值编码时一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制

KVO:键值观察机制,提供了观察某一属性变化的方法,极大的简化了代码

11.线程和进程的区别

1)一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程,线程是操作系统可识别的最小执行和调度单位。

2)资源分类分给进程,同一进程的所有线程共享该进程的所有资源,

3)处理机制分给线程,真正处理机上运行的是线程

4)线程在执行过程中,需要写作同步,不同的线程要利用消息系统通信的办法实现同步

12.锁的几种方式

1)atomic,原子性,保证线程安全

2)使用GCD实现atomic操作,给seter和geter加上同步队列

3)使用NSLock

4)使用互斥锁

13.修饰符的含义

1)assign :此标记说明设置器直接赋值,这也是默认值且setter方法直接将传入的参数赋值给实例变量,不涉及计数变化,也没有引用技术可以供管理,主要用于非指针变量。

2)retian:表示持有特性,一般用于指针对象。就是说你当一个变量,然后这个变量在程序的运行过程中会被更改,并且影响其他方法,当用retian时,会释放旧的对象,将输入对象的索引计数+1,然后将输入的对象赋值给新的对象

3)copy:其setter方法时进行copy操作,与retian处理流程基本一样,先对旧的对象release,再copy出新的对象,retainCount为1,这个是为了减少上下文的依赖而引入的机制,区别在于copy主要用于NSString,retain之指针拷贝,copy是内容拷贝后新的对象开辟新的内存,引用计数为1,原来对象的计数不变。

4)weak:是弱引用,是由ARC引入的对象的变量的属性,相当于assign,只有你打开ARC时才被要求使用,weak比assign多一个功能,就是对象消失后把指针置为nil,避免了野指针,是指向垃圾内存的指针

5)strong:是强引用,是ARC新引入的对象变量属性吗,简单的strong相当于retiain,只有你打开ARC时才会被要求使用。但是对于strong来说,它会自己判断时选择retain还是copy,比较方便。

14 wkwebview比UIwebview的优势

1)多进程,在app主进程之外执行

2)使用更快的nitro javaScript引擎

3)异步执行处理javaScript

4)消除某一些触摸延迟

5)支持服务端的身份校验

5)支持对错误的自签名安全证书和证书进行身份验证

15.为什么说objective-是动态语言

1)Objective-c是一门运行时语言,在编译阶段不确定所有的东西,在运行时根据确定对象类型,对象对应类的方法实现等。

2)它的动态体现在3个方面,动态类型,动态绑定,动态加载

3)动态类型如;id

动态绑定:将方法调用的时机推迟到运行时,在编译阶段,方法的调用不和代码绑定,只有消息发出来后,才会去定调用的代码

动态加载:如图片的2x,3x等

16.什么是消息类型

在oc中,方法的调用时一个消息发送的过程

oc对象发送一个消息的过程如下:

1)向对象发送消息

2)在缓存中查找是否有匹配方法,如果有则响应,否则继续

3)在对象的类对象的方法列表中查找是否有匹配方法,有则响应,否则继续

4)在对象的父类缓存中查找是否有匹配方法,如果有则响应,否则继续

5)在父类的方法列表中查找是否有匹配的方法

6)进入动态解析

7)进入消息重定向

8)进入方法签名

9)进入消息转发

17.代理,通知,block的区别

1)通知:notificationcenter,通知中心,一对多,在app中,很多控制器需要知道一个事件,应该用通知

2)代理:一对一,对于同一协议,一个对象只能设置一个代理delegate,所以单例对象久不能用代理,代理更注重过程信息的传输,比如发起一个请求,可能想知道请求是否已经开始,是否收到了数据,数据是否已经接受完成,数据接收失败。

3)block:delegate一样,一般都是对一对一之间的通信交互,相比代理block有以下特点:

1.写法更加的简练

2.blovk注重结果的传输:比如对一个事件,只想知道成功或者失败,并不需要知道进行了多少多少活着额外的一些信息。

3.block需要注意和防止循环引用。

18。当weak修饰的对象释放后,系统是否直接释放掉对象,其实现原理是什么

weak指针不会增加所引用对象的计数,并在引用的对象被收回后直接被置为nil

实现原理:runtime对注册的类,会进行布局,对于weak对象会放入一个hash表中,用weak只想的对象内存作为key,当此对象的引用计数为0的时候会dealloc,假如weak指向的对象内存地址是a,那么就会以a为键,在这个weak表中搜索,找到所有以a为键的weak对象,从而设置为nil。

19.声明可变数据可以用weak修饰吗?利用strong修饰有什么区别?

数据如果用weak,那么数据一创建完毕就会被销毁,只能用strong,强引用,不会被释放

20.反转二叉树

/**

*  翻转二叉树(又叫:二叉树的镜像)

*

*  @param rootNode 根节点

*

*  @return 翻转后的树根节点(其实就是原二叉树的根节点)

*/

+(BinaryTreeNode*)invertBinaryTree:(BinaryTreeNode*)rootNode{

if(!rootNode) {

returnnil;

   }

if(!rootNode.leftNode&&!rootNode.rightNode) {

returnrootNode;

   }

[selfinvertBinaryTree:rootNode.leftNode];

[selfinvertBinaryTree:rootNode.rightNode];

BinaryTreeNode*tempNode=rootNode.leftNode;

rootNode.leftNode=rootNode.rightNode;

rootNode.rightNode=tempNode;

returnrootNode;

}

21.UIView和CALayer有什么关系

1)UIView负责处理用户交互,负责一直内容的则是它持有的那个CALayer,我们访问和设置的UIVIew的这些负责显示的属性实际访问和设置的都是这个CALayer对应的属性,UIVIew只是将这些才做封装起来了而已。

2)而iOS系统为了处理用户交互事件(触屏操作)用UIView封装了一次CALayer,UIView本身负责处理交互事件,其持有一个Layer,用来负责绘制这个View的内容。而我们对UIView的和绘制相关的属性赋值和访问的时候(frame、backgroundColor等)UIView实际上是直接调用其Layer对应的属性(frame对应frame,center对应position等)的getter和setter。

22.下面的代码会输出什么

@implementationSon:Father

-(id)init{

if(self=[superinit]) {

NSLog(@"%@",NSStringFromClass([selfclass]));

NSLog(@"%@",NSStringFromClass([superclass]));

returnself;

      }

@end

都会输出Son

self是类的隐藏参数,指向当前调用方法的这个类的实例。

super是一个magic keywrod,它本质是一个编译器标识符,和slef是指向同一个消息的接收者。

不同的是:super会告诉编译器,调用class这个方法时,要去父类的方法,而不是本来里的,

上面的例子不管是【self class】 还是 【super class】,接收消息的对象都是当前son *obj这个对象

23以下代码会有什么问题

for(inti=0;i<1000;i++) {

NSString*num=[NSStringstringWithFormat:@"%d",i];//num是临时变量

   }

大次数循环内存暴涨问题

该循环产生大量的临时对象,知道循环结束才释放,可能导致内存泄露,解决方法为在循环中创建自己的autorealeasepool,即使的释放占用内存大的临时变量,减少内存占用峰值

24.frame和bounds有什么不同

frame指的是:该view在夫view坐标系统中的位置和大小,bounds值得是:该view在本身坐标系统中的位置和大小,bounds指的是以自己为原点的坐标系。

25.0bjective-C 的类可以多重继承么?可以实现多个接口么? Category 是什么?重写一个类的方式用继承好还是分类好?为什么?

objecttive-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,cocoa中所有的类都是nsobject的子类,多继承可以使用protocol来实现,cagtegory是类别,一般用分类比较好,用category去重写类的方法,仅对本category有效,不会影响到其他类和原有类的关系。

26、isKindOfClass、isMemberOfClass、 selector 作用分别是什么?

答案:isKindOfClass:作用是某个对象属于某个类型或者继承自某类型。 isMemberOfClass:某个对象确切属于某个类型。 selector:通过方法名,获取在内存中的函数的入口地址

27、 什么是TCP / UDP?

答案: (1)TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。,是面向连接的,建立连接需要经历三次握手,保证数据正确性和数据顺序。 TCP传输数据的形式:点对点传输数据 传输过程比较复杂 但是比较安全 不会出现丢包的现象(比如:QQ文件传输)

(2)UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。是非连接的协议 UDP传输数据的形式:点对面传输数据 传输过程非常简单 但是比较不安全 经常出现丢包的现象 传输方只管传输不管接收方是否接受成功(比如:短信群发) IP 由46位(0255之间的数字组成) 作为设备的唯一标识

(3)TCP 的三次握手 第一次握手:客户端发送 syn 包到服务器,并进入 syn_send状态,等待服务器进行确认; 第二次握手:服务器收到客户端的 syn 包,必须确认客户的SYN,同时自己也发送一个 SYN 包,即 SYN + ACK 包,此时服务器进入 SYN_RECV 状态; 第三次握手:客户收到服务器发送的 SYN+ACK 包之后,向服务器发送确认包, 此包发送完毕,客户端和服务器进入ESTABLISHED 状态,完成第三次握手。

28.什么是mvvm,主要目的是什么,优点有哪些?

mvvm就是m-v-vm

1)View主要用于界面呈现

2)Viewmodle是mvvm架构中最重要的部分,ViewModel中包含属性,方法,事件,属性,验证等逻辑,负责view与model之间的通讯

3)Mode就是我们常说的数据模型,用于数据的构造,数据的驱动,主要提供基础实体的属性

MVVM的主要目的是分离视图和模型

MVVM的优先:低耦合,可重用性,独立开发,可测试

29.NSOperation与GCD的区别

1。GCD是底层C语言构成的API,NSOperationQueue与其相关是obj对象,在GCD中,在队列中执行的是由blovk构成的任务,这个是一个轻量级的数据结构,而NSOperationQueue作为一个对象,为我们提供了更多选择

2)NSOperationQueue可以取消已经设定要准备执行的任务,gcd则不可以

3)NSOperationQueue能够方便的设置依赖关系,

4)NSOperationQueue可以应用KVO

5)NSOperationQueue能够使用block和方法,GCD只能用block

6)NSOperation的高级:最大并发数,控制线程个数,优化了线程的暂停、继续、取消功能(GCD实现起来太难,可以用 KVO ),依赖关系,可以让异步任务同步执行.

30.什么时候用weak,相比assign由什么不同

1)在ARC中,在有可能出现循环引用地方,往往要通过其中一端使用weak来解决,比如delegate代理属性

2)自身已经对他进行了一次强引用,没必要再强引用一次,比如IBOutlet

不同点:

assign可以用非OC对象,而weak必须用于oc对象

weak表明该属性定义了一种非拥有关系,在属性所指的对象销毁时,属性值会自动清空

31介绍一下反射机制

1)class反射:通过类名的方式实例化对象

2)sel反射:通过方法的字符串实例化方法

32一个objc对象的isa的指针指向什么,

指向他的类对象,从而可以找到对象上的方法

上一篇下一篇

猜你喜欢

热点阅读