看到一篇文章,里边木有面试题答案,就小总结了一下。传送门
初次编写,如有不对之处请下方留言共同学习,拜谢了~!!!
希望对大家有所帮助,对我自己有所帮助
话不多说直接正题:
1、我们说的Objective-C是动态运行时语言是什么意思?
首先,这个问题涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
好吧,上边是我复制的。我认为就是OC的动态特性。主要是:动态类型(如id),动态绑定,动态加载。之所以叫动态,
就是必须运行到时(run time)才会去做一些事情。
2、讲一下MVC和MVVM,MVP?
好吧这个就是没吃过猪肉还没见过猪跑嘛?我最常用的是MVC。^^.
简单来说MVC(Model View Controller)就是模型(Model)- 视图(View)-控制器(Controller)的缩写,
Model是用来处理数据,View是用来展示界面,Cotroller是用来调节他们两者之间的交互。
这个是最常用的。但是View和Model之间的直接交互,就导致了View和Model之间的耦合性比较大。
MVP (Model View Presenter)是MVC模式的变种,使用Presenter代替了Controller,而且改变了数据流向
View和Model之间不再直接进行交互,而是通过Presenter来进行的。总体来说Presenter同时持有View和Model。
优点:整体框架分层清晰,降低了耦合度。
缺点:需要加入Presenter来作为协调Model和View的桥梁,同时也导致了Presenter的臃肿。在维护起来不方便。
MVVM(Model View View-Model ViewModel)其实是对MVP的一种改进,他将Presenter替换成ViewModel,
并通过双向数据绑定来实现视图和数据的交互。
优点:使其数据流向更加清晰(脑补一下就是云对雨,x对风,大陆对长空)。一一对应起来。
缺点:这种架构没有统一的实现方式,每个人各有特色。我接触过得各有不同。而且有一定的学习成本。(不懂得人去学习也得一周左右吧,不抬杠,学过之后再来回话。"大牛请忽略")
3、为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
3.1 因为用weak修饰的对象引用计数不会+1.好吧。说白了就是不会造成循环引用。0.0~!
3.2 delegate偏重于用户交互的回调。dataSource偏重于数据的回调。
3.3 首先共同点都是实现回调的方式。算了直白点说就是一个一对一,一个一对多。一个编写简单,一个实现繁复。
对于什么时候用block什么时候用代理简单来说就是公共接口,方法较多,回调类型较多可以选择用代理。对于异步和简单的回调用block好一点。
4、属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?
好吧。这个题很low,但是很考验人。不关心这些一般不知道
4.1 属性的实质,包含哪些:
@property = ivar + getter + setter;
利用class_copyPropertyList 查看类的所有属性
利用class_copyIvarList查看类的所有成员变量
利用class_copyMethodList查看类的所有方法
4.2 属性默认的关键字有哪些 (好吧,我也不知道。本体底部会有传送门)
@dynamic告诉编译器,属性的setter与getter方法由用户自己实现。
@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。
4.2请看这里 属性的默认关键字有哪些
5、NSString为什么要用copy关键字,如果用strong会有什么问题?
copy修饰的是深拷贝,改变源字符串,不影响copy的属性内容。
strong修饰的属性就随着源字符串改变而改变了。
这些都是说修饰可变类型字符串。当然不可变的就随意发挥了。尽量还是用copy。因为什么呢?因为如果你来回转换呢?哈哈
7、如何令自己所写的对象具有拷贝功能?
实现NSCoping协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying与 NSMutableCopying协议。
8、简述kvo、kvc、Delegate、通知,他们之间的区别?
1、代理的效率比通知要高。
2、代理比通知更加直接。
3、kvo和通知,代理一样,都是负责通信的。kvo和通知没有返回值,而代理有返回值。
4、代理是一对一,通知,kvo是一对多。
9、include与#import的区别?#import与@class的区别?
怎么说呢, include 是C预言中用来引用的关键字。反正我是没用过
#import 是OC中用来代替 include的关键字。#import确保了同一个文件只能被导入一次,从而别面了使用 #include容易引起的重复导入问题。
@class只是告诉编译器,后边遇到的这名称是类名,至于这个类是如何实现的暂时不考虑,用来解决线程锁死的问题。
就相当于一个军队遇见了另外一个军对,打不打不无所谓,然后两军衣服不一样。纵横过去。
10、nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?
nonatomic和atomic用来决定编译器生成的getter和setter操作是否为原子。
atomic不是绝对的线程安全。因为什么呢,因为atomic的本意是指属性的存取方法是线程安全的,不是保证整个对象是线程安全的。
如果不是,那应该如何实现?传送门
是不是很枯燥无味?嗯,你被辞职了嘛?工作找好了嘛?
11、Objective-C与C、C+++之间的联系和区别?
OC与C的区别:OC中兼容C两者可以混合编程。OC是面向对象的,有类,对象的概念,C却木有。
C是面向过程的语言。
OC与C++的区别:
1、继承。OC不可以多重继承,C++却可以
2、函数调用。OC需要通过消息传递机制调用函数,C++却可以直接调用
3、定型。OC是动态定型。C++是等着你去找他。是静态类型。
4、接口。OC采用的是protocol协议。C++采用虚函数的形式。
5、方法重载。OC不允许有同一个类中出现两个相同的方法名。C++中允许两个方法名相同。
好吧。其实我也不知道,我百度的。 -_-!
12、UICollectionView自定义layout如何实现?
额。这个问题,不知道怎么说好。如何自定义。不就是继承UICollectionViewFlowLayout类实现字节想要实现的东西吗?
13、进程和线程的区别?同步异步的区别?并行和并发的区别?
这个问题怎么说呢,一步一步说
进程和线程的区别:进程是资源分配和调度的一个独立单元。就相当于是公交车调度站。一个进程里边可以有多个线程,
一个进程里边至少有一个线程,就相当于一个公交车调度站里最少有一辆公交车,也可以有多个公交车。
同步异步的区别:同步是进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。
异步是和同步相互对立的,同步是顺序执行,而异步是相互独立的。
并行:并行是同是发生多个并发事件,具有并发的含义,但并发不一定并行。
这个并行并发我也不太懂,应该是这样的。不对的话请自行百度。
14、线程间通信?
比如说,一个线程传递数据给另一个线程。
一个线程执行完特定的任务后,转到另一个线程继续执行。
比如最常见的sd图片加载。(脑补画面)好了,完成。
15、GCD的一些常用的函数?(group,barrier,信号量,线程同步)
下边有传送门,我常用的就是定时器,回到主线程,开一个分线程。搞一个runLoop。等等
16、如何访问并修改一个类的私有属性?
1、通过KVC访问并修改。
2、通过runtime访问并修改。
通过kvc访问并修改 通过runtime访问并修改
17、数据持久化的几个方案?
1、plist文件 2、preference 3、归档 4、SQLite3(fmdb) 5、CoreData
18、说一下AppDelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?
这个问题没什么说的,全靠自己平时积累。其实这个问题问了无非就是考验一下你有没有看过appDelegate而已。有没有做过启动页,有没有处理过其他事件。
自行回去学习。
19、NSCache优于NSDictionary的几点?
1、 NSCache是线程安全的。
2、当内存不足时NSCach会自动释放内存。
3、NSCache可以指定缓存的限额,当缓存超出限额自动释放内存
20、知不知道Designated Initializer?使用它的时候有什么需要注意的问题?
这个问题可能好多人都不知道,也不理解他是啥意思,其实这个就是(指定初始化器)如果不懂,不知道,不清楚。
而你又很想知道是撒,请读下文。
耐心读完吧。亲
21、实现description方法能取到什么效果?
布吉岛。知道的请留言告知。谢谢。我理解的是用NSLog输出的时候会调用description的方法。具体能得到什么效果,自己试验一下吧。
22、OC使用什么机制管理对象内存?
这题应该考的是OC的内存管理,ARC和MRC。经过排查我看到了说是通过retainCount来管理的。布吉岛,我感觉这两点答上来应该不会差。
OK!!!这个初级面试题基本就是这样。后续会有中级,高级的。如果有不同意见,或见解,请提出!共同进步。谢谢!
网友评论