2017面试问题

2017-07-11  本文已影响43人  UILabelkell

TCP与UDP的区别,以及它们各自的定义

TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
TCP要求系统资源较多,UDP较少。
UDP程序结构较简单。
流模式(TCP)与数据报模式(UDP)。
TCP保证数据正确性,UDP可能丢包。
TCP保证数据顺序,UDP不保证。
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

1.为什么说Objective-C是一门动态的语言?

2.讲一下MVC和MVVM,MVP?

map:MVP是把MVC中的Controller换成了Presenter(呈现),目的就是为了完全切断View跟Model之间的联系,由Presenter充当桥梁,做到View-Model之间通信的完全隔离。

MVVM:那么MVVM则是思想的完全变革。它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View上。

3.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?

weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制

delegate运行成本低。block成本很高的。

block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作

1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,单例对象就不能用代理这是不对的❎,任何人,任何对象,只要接受,只要允许,只要遵守了相关的协议,TA就可以使用代理(感谢http://www.jianshu.com/users/22fefaea871c同学指出错误);

2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
1:写法更简练,不需要写protocol、函数等等

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

3,block需要注意防止循环引用:

<pre>ARC下这样防止:

__weak typeof(self) weakSelf = self;

[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {

[weakSelf doSomething];

}];
非ARC

__block typeof(self) weakSelf = self;

[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {

[weakSelf doSomething];

}];
</pre>

4.属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?

@synthesize
编译器期间,让编译器自动生成getter/setter方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
然后由自己实现存取方法
或存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行的时动态生成子类属性

5.属性的默认关键字是什么?

atomic,readwrite,assign
atomic,readwrite,strong

6.NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的)

1、因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.

2、如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.

7.如何令自己所写的对象具有拷贝功能?

若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying与 NSMutableCopying协议。

具体步骤:

需声明该类遵从 NSCopying 协议
实现 NSCopying 协议。该协议只有一个方法:

对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。

而nonatomic就没有这个保证了。所以,nonatomic的速度要比atomic快。

不过atomic可并不能保证线程安全。如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,3种都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。

保证数据完整性——这个多线程编程的最大挑战之一——往往还需要借助其他手段。

11.UICollectionView自定义layout如何实现?

12.用StoryBoard开发界面有什么弊端?如何避免?

不怎么好重构吧,
使用Storyboard的一个极大缺点是Version Control很容易冲突,所以Team开发时一般一个Storeboard只有一个人维护。优点是方便,流程控制也方便。。。和代码互有优劣吧

1.block的实质是什么?一共有几种block?都是什么情况下生成的?

block其实也是一个对象,在存放block对象的内存区域中,也包含我们经常说的isa指针,和一些能让block正常运转的各种信息。关于isa指针,在这里简单的说一下,在OC中每个实例对象都会有个isa指针,它指向对象的类,其实在类里面也会有isa指针,这个指针是指向该类的元类。所以说类的实质也是对象,在OC中一切皆对象

AFN为什么添加一条常驻线程?
主线程是UI线程 你要在这做超过16ms的事情就会卡顿,时间再长就会造成界面卡死。 一般rom对主线程卡住10s以上的应用都会ANR,让用户选择强制杀死应用。

上一篇下一篇

猜你喜欢

热点阅读