iOS面试题Object-C部分

iOS面试题 Object-C部分

Object-C 基础题

1、NSSet 一般用什么关键字修饰。为什么?
2、浅拷贝和深拷贝的区别?

浅拷贝:只复制指向对象的指针,而不复制引用对象本身。
深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,当修改A时,A_copy不变。

3、使用Block时需要注意哪些问题。
  1. 在block内部使用外部指针且会造成循环引用情况下,需要用__weak修饰外部指针: __weak typeof(self) weakSelf = self;
  2. 在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下。 __strong typeof(self) strongSelf = weakSelf;
  3. 如果需要在block内部改变外部栈区变量的话,需要在用__block修饰外部变量
4、UIView 和 CALayer 是什么关系?

UIView 继承自UIResponder类,可以响应事件。
CALayer直接继承NSObject类。不可以响应事件。
UIView时CALayer的代理。
UIView主要处理事件,CALayer负责绘制。

5、iOS中数据持久化方案有哪些?

NSUserDefault 简单数据快速读写
Property list (属性列表)文件存储
Archiver (归档)
SQLite 本地数据库

6、单个viewController的生命周期?
  • initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
  • loadView:加载view
  • viewDidLoad:view加载完毕
  • viewWillAppear:控制器的view将要显示
  • viewWillLayoutSubviews:控制器的view将要布局子控件
  • viewDidLayoutSubviews:控制器的view布局子控件完成
  • viewDidAppear:控制器的view完全显示
  • viewWillDisappear:控制器的view即将消失的时候
  • viewDidDisappear:控制器的view完全消失的时候
  • dealloc 控制器销毁
7、Objective-C 如何对内存管理的?

答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池

1). 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。

2). 手动内存计数MRC:遵循内存谁申请、谁释放;谁添加,谁释放的原则。

3). 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

8、继承、分类和类扩展
  1. 分类有名字,类扩展没有分类名字,是一种特殊的分类。
  2. 分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法。
  3. 继承可以增加,修改或者删除方法,并且可以增加属性。
9、通常对象为啥要用strong?

用strong就是要持有他的指针,指针就是指向内存,就是叫被引用的内存不被释放

10、instancetype和id的异同?

1.相同点
都可以作为方法的返回类型
2.不同点
1.instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;
2.instancetype只能作为返回值,不能像id那样作为参数

11、isKindOfClass和isMemberOfClass的区别

isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员

isMemberOfClass只能确定一个对象是否是当前类的成员

12、delegate 和 notification 的区别

二者都用于传递消息,不同之处主要在于一个是一对一的,另一个是一对多的。

13、iOS多线程技术有哪几种方式?

pthread、NSThread、GCD、NSOperation

14、什么是懒加载,懒加载有什么作用

用到时才初始化,延迟加载。
延时加载可以避免内存过高

15、有哪些常见的Crash场景
  1. 访问了僵尸对象
  2. 访问了不存在的方法
  3. 数组越界
16、说一下静态库和动态库之间的区别

动态库形式:.dylib 和 .framework

静态库形式:.a和.framework

区别:

  • 静态库:链接时,静态库会被完整的复制到可执行文件中
  • 系统动态库:链接时不复制,程序运行时有系统动态加载到内存,提供内存掉用,系统只加载一次,多个程序共用,节省内存。
17、使用atomic一定是线程安全的吗?

不一定。只有在执行setter或getter方法时是线程安全的。

18、什么是 KVO 和 KVC?

KVC(key-value-coding)键值编码,是一种间接访问实例变量的方法。提供一种机制来间接访问对象的属性

KVO是一种基于KVC实现的观察者模式。当指定的被观察的对象的属性更改了,KVO会以自动或手动方式通知观察者。

19 堆、栈

栈:由系统管理分配和释放。一般存放函数的参数值,和局部变量(函数中的基本数据类型)。栈区的操作方式类似数据结构中的栈(先进后出)

堆:由程序员管理(分配释放),若程序员不释放,程序结束时可能由系统回收。一般由程序员 alloc、new 出来的对象。堆的操作方式与数据结构中的堆不同,操作方式类似于链表

Object-C 进阶题:

1、什么是 RunLoop?
2、说的OC是动态运行时语言是什么意思?

主要是将数据类型的确定由编译时,推迟到了运行时。

简单来说, 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

3、isa指针?

对象的isa指针指向所属类。
类的isa指针指向所属的元类。
元类的isa指针指向了根元类;跟元类指向了自己

4.Objective C都有哪些锁机制

1.@synchronized 同步锁
2.NSLock 对象锁
3.NSRecursiveLock 递归锁
4.NSConditionLock 条件锁
5.pthread_mutex 互斥锁(C语言)
6.dispatch_semaphore 信号量实现加锁(GCD)

5、NSNotificationCenter是在哪个线程发送的通知?

6、load和initialize方法分别在什么时候调用的?

7、说一下hash算法。

8、什么是method swizzling?

9、runtime 如何实现 weak 属性

要实现 weak 属性,首先要搞清楚 weak 属性的特点:

weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同 assign 类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。

那么 runtime 如何实现 weak 变量的自动置nil?

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

10、dispatch_barrier_async的作用是什么?

栏栅函数

计算机基础题

1、get 和 post 的区别
  1. get用来获取数据,post用来提交数据
  2. get参数有长度限制,而post无限制。
  3. get是明文传输,post是放在请求体中
  4. get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中
1、HTTP与HTTPS的区别?
  1. HTTPS协议需要到CA申请证书
  2. HTTP是明文传输,HTTPS则是具有安全性的SSL加密传输
  3. HTTP和HTTPS使用的端口也不一样,前者是80,后者是443
  4. HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

3、说一下TCP和UDP

UDP协议是全称是用户数据协议,在OSI模型中,在第四层网络层。UDP有不提供数据包分组、组装和不对数据包进行排序的缺点,也就是说,当报问发送之后,是无法得知器是否安全完整的达到。

TCP协议全称是传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是面向连接的、可靠的、流协议。流就是指不间断的数据结构,你可以把它想象成排水管里面的水流。

实战应用相关的题目

1、麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)

2、如何检测内存泄漏

3、如何优化App的性能。

4、抓包工具的使用。

5、苹果掉单问题如何解决

7、有一个数组,我要把里面的元素去重。你会怎么做?

8、Git与SVN之间的比较。

0%