博客> 常见的20个面试题
常见的20个面试题
2019-12-10 21:11 评论:0 阅读:1169 蓝波大人

项目终于忙完了,现在有时间把自己之前面试遇到过的一些问题总结出来,供大家参考参考.(这是第一次写博客,新手上路,多多关照) 1.ARC存在内存泄漏吗? ARC中如果内存管理不当的话,也会存在内存泄漏,例如: ARC :只会对oc 对象进行内存管理,即:苹果有句名言:ARC is only for NSObject。 但是对c对象或是CG开头的对象,即存在于 Core Foundation框架 (CoreFoundation.framework 是一组C语言接口)中的对象无效,需要手动的retain 和release。 例如:CGImageRef 也是一个Image的指针,ARC不会进行处理。 使用ARC的项目,一般内存泄漏都是malloc、自定义结构、资源引起的,多注意这些地方进行分析。

2.为什么delegate属于都是assing而不是retain的? 防止循环引用,以至于对象无法得到正确的释放

3.@synthesize与@dynamic的区别 前者是系统自动生成getter和setter属性声明 后者的意思是告诉编译器,属性的获取与赋值方法由用户自己实现,不自动生成。

4.延展与类目 类目:为已知的类增加新的方法 延展:在原始类中实现类目声明的方法,延展可以添加属性。它的方法是私有的,但是也可以调用if ([p respondsToSelector:@selector(test2)])

5.oc中的协议可以设置可选实现与必须实现, java中必须全部实现所有的协议方法

6。单例模式 static 类名 instance = nil; +(类名 *)shareInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken,^{ 初始化instance }); return instance; }

重写父类的方法 +(instancetype)allocWithZone:(struct _NSZone *)zone {

instance = [super allocwithZone:zone];

return instance; }

-(id)copyWithZone:(struct _NSZone *)zone { return self; }

7.socket与http连接的区别 http连接就是所谓的短连接,即客服端向服务器发送一次请求,服务器响应连接后,就会立即断掉 socket就是长连接,理论上客服端和服务器建立连接后,将不会主动断掉

8.TCP连接的三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

9.fram与bounce的区别 fram是以父视图的坐标系统中的位置和大小为准 bounce是在本身坐标系统中的位置与大小

10.loadView调用:当控制器的根视图view为空,且此view被访问时则调用 11.当内存不足,系统发出警告,处理的方法是 内存不足,系统会调用didReceiViewMemoryWarning方法通知控制器内存不足, ios6之前的处理方式:调用didReceiViewMemoryWarning后,将self.view设置为nil,并且再调用viewDidUnload方法,在里面释放子视图 ios6之后,调用didReceiViewMemoryWarning之后,不再调用viewDidUnload方法,在didReceiViewMemoryWarning里面把self.view设置为nil,并且在里面释放子视图

12.block在内存管理上的特点 系统自定义的block,不需要做任何处理 自定义的block使用copy需要注意: 1.在block引用局部变量时,该对象会被retain,如果不想要让他retain需要在前面加上_weak 2.引用局部的基本数据类型时,在block里面是个常量,需要修改它的的数据可以在前面加block,标记它为block变量,就可以在block里面修改它的值 3.引用全局变量,也会把该对象retain,需要自己手动管理内存

解决循环引用的问题:将当前的对象赋值给一个局部变量,并且使用_block关键字修饰该局部变量

13.ios中的数据持久化的方式 属性列表,对象归档,SQLite,CoreData

属性列表:

  • NSUserDefaults,用于存储配置信息,一般 [NSUserDefaults standardUserDefaults]就够用了

归档的概念和用法 概念:对象归档是指将对象写入文件保存在硬盘的文件内,当在次打开程序时,可以还原这些对象。 也可以称为对象序列化、对象持外化。 使用两个类:NSKeyedA richivNSKeyedUnarchiver

14.ios9的适配问题 1.大部分社交平台接口不支持https 问题描述:在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据。对ShareSDK来说,具体表现可能是,无法授权、分享、获取用户信息等 解决方法:暂时退回到http 设置域把不支持https协议的接口设置成http的接口 2.大部分社交平台sdk不支持bitcode 问题描述:iOS 9新建项目默认需要支持bitcode,而不支持bitcode的SDK会导致无法编译运行。 解决方法: (1)、暂时关闭对bitcode的支持(建议),方法如下图 (2)、移除不支持bitcode的平台SDK。 3.添加Scheme白名单 问题描述:在iOS 9下涉及到平台客户端跳转,系统会自动到项目info.plist下检测是否设置平台Scheme。对于需要配置的平台,如果没有配置,就无法正常跳转平台客户端。因此要支持客户端的分享和授权等,需要配置Scheme名单

15.MethodSwizzling是一种在运行时修改方法名与方法实现映射关系的技术,常用于在系统内部方法的基础上增加新的处理流程。

16.当一个空指针调用了一个方法会发生什么? 程序不会奔溃,这是oc自带的消息机制,nil也能发送消息,而不会报错。 18.oc中的回调机制(这个我面试了几家都有问到,主要是在项目中也用到很多) 1.协议 2.使用respondsToSelector和performSelector进行回调 3.函数指针 4.通知 5.block

17.自动释放池(笔试比较多) 在ObjC中也有一种内存自动释放的机制叫做“自动引用计数”(或“自动释放池”),与C#、Java不同的是,这只是一种半自动的机制,有些操作还是需要我们手动设置的。 自动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelase方法,那么当代码块执行完之后,在块中调用过autorelease方法 的对象都会自动调用一次release方法。这样一来就起到了自动释放的作用,同时对象的销毁过程也得到了延迟(统一调用release方法)

18.懒加载 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,  写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 2.使用懒加载的好处: (1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 (2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合

19.优化tableView的方法

  1. 重用cell实例:对于特殊类型的cell,你应该只有一个实例,而没有更多。
  2. 不要在cellForRowAtIndexPath:方法中绑定数据,因为在此时cell还没有显示。可以使用UITableView的delegate中的tableView:willDisplayCell:forRowAtIndexPath:方法。 3.懒加载

20.多线程 多线程包括:NSThread ,Cocoa operation,GCD ·NSThread ·优点:NSThread 比其他两个轻量级 ·缺点:需要自己管理线程的生命周期,线程同步,加锁等,线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread: Cocoa threads: 使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程。如果你选择thread来实现多线程,那么 NSThread 就是官方推荐优先选用的方式。 Cocoa operation ·优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上 ·Cocoa operation 相关的类是 NSOperation ,NSOperationQueue。 NSOperationQueue是操作队列,用来管理和控制NSOperation。NSOperation是操作任 务,是抽象类,使用它必须用它的子类

·GCD(Grand Central Dispatch) ·GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的 一个高效、强大、底层的技术。

收藏
3
sina weixin mail 回到顶部