iOS 2019面试题&答案

正在找工作,就总结一下面试题和答案,希望对大家和我自己都有帮助

  1. 我们说的Objective-C是动态运行时语言是什么意思?
    运行时机制是我们直到运行时才去决定一个对象的类别,以及调用该对象类别指定的方法

  2. 讲一下MVC和MVVM,MVP?
    MVC(Model,View,Controller):简单点讲就是模型(Model),视图(View),控制器(Controller)的缩写,Model是用来处理数据,View是来展示界面视图,Controller用来调节model和View之间的交互。是我们常用的设计模式之一,但是View和Model之间直接进行交互,造成两者之间的解耦性比较大。
    MVP(Model,View,Presenter):是MVC的变种,用Presenter代替Controller,改变了数据流向,View和Model不用直接进行交互,而是通过Presneter来进行,总体来说,Presenter同时持有model和view。
    优点:使框架更清晰,降低了耦合度
    缺点:需要加入Prsenter来作为model和view之间的桥梁,导致了presenter的臃肿。
    MVVP(Model,View,ViewModel):是对MVP的改进,使用ViewModel代替Presenter,并通过双向数据绑定来实现数据与视图的交互。
    优点:使数据流向更加清晰
    缺点:这种架构没有统一的实现方式。

  3. 为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
    1.因为weak修饰的对象引用计数不会+1,简单的说就是不会造成循环引用。
    2.delegate:侧重用户交互的回调,dataSouce侧重于数据的回调。
    3.首先共同点都是实现回调的方法,block是一对一,编写简单,代理一对多,编写繁复。至于什么时候使用block,什么时候使用代理:公众接口,方法较多,回调类型较多的情况下使用代理。对于异步和简单的回调使用block。

  4. 属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?
    4.1 属性的实质,包含哪些:
    @property = ivar + getter + setter
    属性(property)有两大概念:ivar(实例变量),getter+setter(存取方法)
    属性(property)作为object-c的一项特性,主要作用是封装对象中的数据,object-c对象通常会把所需要的数据保存为各种实例变量,实例变量一般通过“存取方法”来访问。其中“获取方法”getter用来读取变量值,“设置方法”setter用来写入变量值。
    4.2 属性默认的关键字有哪些readwrite,readonly,assign,retain,copy,nonatomic
    1). readwrite 是可读可写特性。需要生成getter方法和setter方法。
    2). readonly 是只读特性。只会生成getter方法,不会生成setter方法,不希望属性在类外改变。
    3). assign 是赋值特性。setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于基本数据类型。
    4). retain(MRC)/strong(ARC) 表示持有特性。setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1。
    5). copy 表示拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。
    6). nonatomic 非原子操作。决定编译器生成的setter和getter方法是否是原子操作,atomic表示多线程安全,一般使用nonatomic,效率高。
    4.3 @dynamic关键字和@synthesize关键字是用来做什么的?
    @dynamic告诉编译器,属性的setter和getter方法由用户自己实现
    @synthesize的语义是你如果没有手动实现setter和getter方法,那么编译器会自动为你加上这两个方法。。----------》错误的 正确答案:1.指定实例变量 2.为实例变量修改名称

  5. HTTP协议中 POST 方法和 GET 方法有那些区别?
    GET用于向服务器请求数据,POST用于提交数据
    GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作
    GET请求的URL有长度限制,POST请求不会有长度限制

  6. 什么是 TCP / UDP ?
    TCP:传输控制协议。
    UDP:用户数据协议。
    TCP 是面向连接的,建立连接需要经历三次握手,是可靠的传输层协议。
    UDP 是面向无连接的,数据传输是不可靠的,它只管发,不管收不收得到。
    简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性一般。

  7. List item

  8. NSString为什么要用copy关键字,如果用strong会有什么问题?
    copy修饰的是深拷贝,改变源字符串,不会改变copy的属性内容
    strong修饰的属性会随着源字符串改变而改变

  9. 如何令自己所写的对象具有拷贝功能?
    那就实现NSCopying协议,如果所写的对象有可变和不可变两个类型,那就要同时实现NSCopying与NSMutableCopying协议。

  10. 简述kvo、kvc、Delegate、通知,他们之间的区别?
    1.代理的效率比通知高
    2.代理比通知更直接
    3,kvo和代理,通知一样都是负责通信的,,kvo和通知没有返回值,代理有返回值。
    4.代理是一对一,通知,kvo是一对多。

  11. 什么是 KVO 和 KVC?
    KVO(Key - Value - Coding):键值编码,是一种通过字符串间接访问对象的方式,给属性赋值。
    stu.name = @“张三” // 点语法给属性赋值
    [stu setValue:@“张三” forKey:@“name”]; // 通过字符串使用KVC方式给属性赋值
    KVO(key - value - observing):键值观察机制,提供了通过观察某一属性的变化,极大的简化了代码。kvo只能被kvc触发,包括使用setValue:forKey:方法和点语法。
    // 通过下方方法为属性添加KVO观察
    (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context; // 当被观察的属性发送变化时,会自动触发下方方法 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{}

  12. natomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?
    nonatomic和atomic用来决定编译器生成的getter和setter操作是否为原子。atomic不是绝对的线程安全。因为什么呢,因为atomic的本意是指属性的存取方法是线程安全的,不是保证整个对象是线程安全的。

  13. 进程和线程的区别?同步异步的区别?并行和并发的区别?
    进程和线程的区别:进程是资源分配和调度的一个独立单元。就相当于是公交车调度站。一个进程里边可以有多个线程,一个进程里边至少有一个线程,就相当于一个公交车调度站里最少有一辆公交车,也可以有多个公交车。
    同步异步的区别:同步是进程之间的关系,不是相互排斥临界资源的关系,而是相互依赖的关系。异步是和同步相互对立的,同步是顺序执行,而异步是相互独立的。
    并行:并行是同是发生多个并发事件,具有并发的含义,但并发不一定并行。

  14. 线程间通信?
    NSThread、GCD、NSOperation。
    比如说,一个线程传递数据给另一个线程。
    一个线程执行完特定的任务后,转到另一个线程继续执行。
    比如最常见的sd图片加载。(脑补画面)好了,完成。

  15. 多线程技术有哪几种方式?
    pthread、NSThread、GCD、NSOperation

  16. 如何访问并修改一个类的私有属性?
    1、通过KVC访问并修改。
    2、通过runtime访问并修改。

  17. GCD的一些常用的函数?(group,barrier,信号量,线程同步)
    1.延迟执行任务函数:dispatch_after(…)。
    2.一次性执行dispatch_once(…)。
    3.栅栏函数dispatch_barrier_async/dispatch_barrier_sync。
    4.队列组的使用dispatch_group_t。
    5.GCD定时器。

  18. 数据持久化的几个方案?
    1、plist文件 2、preference 3、归档 4、SQLite3(fmdb) 5、CoreData

  19. NSCache优于NSDictionary的几点?
    1、 NSCache是线程安全的。
    2、当内存不足时NSCach会自动释放内存。
    3、NSCache可以指定缓存的限额,当缓存超出限额自动释放内存

  20. OC使用什么机制管理对象内存?or OC的内存管理
    Objective-C的内存管理主要有三种方式ARC(自动内存计数)、MRC手动内存计数、内存池。
    1). 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。
    2). 手动内存计数MRC:遵循内存谁申请、谁释放;谁添加,谁释放的原则。
    3). 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

  21. block的实质是什么?一共有几种block?都是什么情况下生成的?
    闭包(block):闭包就是获取其它函数局部变量的匿名函数。
    block有三种:
    静态区(全局区)block:不引用外部变量而存在,作为静态区的对象,它的释放是有操作系统控制的。
    栈区block:位于内存的栈区,一般作为函数的参数出现。
    堆区block:位于内存的堆区,一般作为对象的property出现。
    1). 在block内部使用外部指针且会造成循环引用情况下,需要用__week修饰外部指针: __weak typeof(self) weakSelf = self;
    2). 在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下。 __strong typeof(self) strongSelf = weakSelf;
    3). 如果需要在block内部改变外部栈区变量的话,需要在用__block修饰外部变量。

  22. 实现description方法能取到什么效果?
    1.NSLog(@"%@", objectA);这会自动调用objectA的description方法来输出ObjectA的描述信息.
    2.description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)
    3.description方法是基类NSObject 所带的方法,因为其默认实现是返回类名和对象的内存地址, 这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现。

  23. iOS事件传递响应链是什么?
    当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图。在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UIEvent形式的实例,然后找到当前运行的程序,逐级寻找能够响应这个事件的对象,直到没有响应者响应。这一寻找的过程,被称作事件的响应链。
    不同的响应者以链式方式寻找,AppDelegate->UIApplication->UIWindow->UIViewController->UIView->UIButton。

  24. 什么是 RunLoop
    从字面上讲就是运行循环,它内部就是do-while循环,在这个循环内部不断地处理各种任务。 一个线程对应一个RunLoop,基本作用就是保持程序的持续运行,处理app中的各种事件。通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。 主线程的run loop默认是启动的。iOS的应用程序里面,程序启动后会有一个如下的main()函数 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }

  25. 什么是 Runtime?
    Runtime又叫运行时,是一套底层的C语言API,其为iOS内部的核心之一,我们平时编写的OC代码,底层都是基于它来实现的。

  26. Runtime实现的机制是什么,怎么用,一般用于干嘛?
    1). 使用时需要导入的头文件 <objc/message.h> <objc/runtime.h> 2). Runtime 运行时机制,它是一套C语言库。 3). 实际上我们编写的所有OC代码,最终都是转成了runtime库的东西。 比如: 类转成了 Runtime 库里面的结构体等数据类型, 方法转成了 Runtime 库里面的C语言函数, 平时调方法都是转成了 objc_msgSend 函数(所以说OC有个消息发送机制) // OC是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector)。 // [stu show]; 在objc动态编译时,会被转意为:objc_msgSend(stu, @selector(show)); 4). 因此,可以说 Runtime 是OC的底层实现,是OC的幕后执行者。 有了Runtime库,能做什么事情呢? Runtime库里面包含了跟类、成员变量、方法相关的API。 比如: (1)获取类里面的所有成员变量。 (2)为类动态添加成员变量。 (3)动态改变类的方法实现。 (4)为类动态添加新的方法等。 因此,有了Runtime,想怎么改就怎么改。

  27. Category类别里能不能添加属性和实例变量?
    不能添加属性和实例变量
    Category类别可以添加实例方法,类方法,甚至可以实现协议,添加属性,但不可以添加实例变量和属性。

  28. NSCopying,NSCoding的区别?
    NSCopying protocol 实现对象复制功能,在对象接收到copy消息后copyWithZone会被调用,在此方法中应创建一个新的同类型对象,并且设备其所有属性后返回,创建该新对象时需要使用allocWithZone方法,该方法可以通过一个已经指定分配好的内存创建新的对象,即当以下方法被调用时内存已分配完毕,将通过NSZone对象封装传递过来。
    同样的有NSMutableCopying来处理mutabliecopy消息
    如果诸如NSArray NSDictionary 的initWithDictionary:copyItems:方法时,元素对象也必需实现NSCopying

- (id)copyWithZone:(NSZone *)zone
{
    MyData* obj = [[[self class] allocWithZone:zone] init];
    obj.name = [self copy];
    obj.age = self.age;
    return obj;
    }

NSCoding protocol 实现对象序列化功能,对象与二进制之间的转换,当收到转换消息时archiver会以super class形势NSCoder传递到对象内部,在以下方法中将对象的逐个属性编码进NSCoder中或解码到当前对象,并根据相应的键值做索引。
被编码后的对象可以以NSData的形势呈现,即可以使用writeToFile或dataWithContentsOfFile写入或从本地文件读出。

对一个NSArray或NSDictionary对象执行writeToFile方法时,需要保证所有元素为基本数据类型(NSString,NSData),否则需要将元素对象实现NSCoding并且需要将集合对象编译为NSData。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值