iOS开发知识汇总iOS Developer

ios面试题目总结

2017-07-20  本文已影响152人  扑腾的蛾子

一、为什么说Object-C是一门动态语言?

有三个名词容易混淆:

    Dynamic Programming Language  动态语言或动态编程语言

    Dynamically Typed Language 动态类型语言

    Statically Typed Language  静态类型语言         

1、动态语言

动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python也属于动态语言,而c、c++等语言则不属于动态语言。

2、动态类型语言

意思就是类型的检查是在运行时做的。

3、静态类型语言

类型判断是在运行前做的(如编译阶段),比如c#、Java就是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,一般的动态语言都会采用dybamic typing,常出现在脚本语言中。是不是动态类型语言和这门语言是不是类型安全的完全没有联系。

4、不同类型语言的优缺点

静态类型语言的优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此要写很多的类型相关代码,导致不便于阅读、不清晰明了。动态类型语言的优点在于方便阅读,不需要写很多的类型相关的代码;缺点是不方便调试,命名不规范时会造成读不懂。

5、Object-C的动态运行性

Object-C语言是C语言的子集,所以是静态类型语言,但是其特性之一多态让其拥有了动态性。oc的动态性让程序可以在运行时判断其该有的行为,而不是像c等静态语言在编译构建的时候就确定了下来。她的动态性主要体现在以下三个方面:

a、动态类型

b、动态绑定

让代码在运行时判断调用什么方法,而不是编译时,和其他面向对象语言一样,方法调用和代码并没有在编译时绑定到一起,而是在消息发送时才进行连接。运行时决定调用哪个方法。

c、动态载入

让程序在运行时添加代码模块和其他资源,用户可以根据需要加载一些可执行代码和资源,而不是再启动时就加载所有的组件。可执行代码中可以含有和程序运行时整合的新类。

二、讲一下MVC、MVVM、MVP和VIPER

1、前三种设计模式都把一个应用中的实体分成了以下三类:

Models-负责主要的数据或者操作数据的数据访问层。

Views-负责展示层(GUI)。

Controller/Presenter/ViewModel-负责协调Model和View,通常根据用户在View上的动作在Model上做出对应的更改,同时将更改的信息返回到View上。

2、将实体进行划分给我们带来的好处

更好的理解他们之间的关系

复用(尤其是对于View和Model)

独立测试

3、了解MV(X)系列

a、MVC的过去

在我们探讨apple的MVC模式之前,先来了解一下传统的MVC模式


传统的MVC

在这里,View没有任何的界限,仅仅是简单的在controller中呈现Model的变化,三个实体都有通信,紧密耦合,没有复用可言。

b、苹果推荐的MVC-愿景

cocoa的MVC

model和View之间没有了直接联系,controller成了他们之间的一个协调器,controller中去写一些逻辑复杂度比较高的代码。实现了可复用,然而这样就有一个问题。

c、苹果推荐的MVC-事实

事实上的cocoa的MVC

cocoa的MVC模式驱使人们写出臃肿的视图控制器,因为她们经常混杂在View的生命周期中,因此很难说View和controller是分离的。尽管仍然可以将业务逻辑和数据转换到Model中,View的最大任务就是controller传递用户的行为,viewcontroller最终会承担起一些代理和数据源的责任,还负责一些分发和取消网络请求以及一些其他的任务。

像下面的代码

var userCell = tableView.dequeueReusableCellWithIdentifier("identifier")  as  UserCell

userCell.configureWithUser(user)

这个cell实际上直接和Model进行了通信,所以事实上的mvc原则已经违背了,但是这种情况是一直发生的,甚至人们都不会觉得哪里不对,如果严格遵守mvc的话,View必须经过controller的调度才能拿到Model里面的数据,这样势必会导致conreoller的体积增大,难以维护。值得注意的一点是,就开发速度而言,cocoa的mvc是最好的架构选择方案。

d、MVP实现了cocoa的MVC愿景

presenter

用来实现Cocoa的mvc愿景的,MVP的协调器。presenter并没有对viewcontroller的生命周期做出任何改变,因此View了一很容易的模拟出来,在presnter中没有和布局有关的代码,但是它却负责View的更新和状态。

e、MVVM-最新且最伟大的MV(X)的成员

MVVM

他和MVP模式看起来非常的像。view model基本上就是uikit下的控件和以及控件状态,ViewModel的调用会改变Model同时会将Model的改变更新到自身。

如果我们不想自己实现,那么我们有两种选择:

基于kvo的绑定库如RADataBindingswiftBond

完全的函数响应式编程,比如像ReactiveCocoa,RxswiftPromiseKit

4、VIPER-把LEGO建筑经验迁移到iOS app的开发

VIPER

找到一个适合的方法来实现路由对iOS应用是一个挑战,MV(X)系列避开了这个问题。

三、为什么代理要用weak?

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

strong:该对象强引用delegate,外界不能销毁delegate这个对象,并且这样还会导致循环引用。

四、Datasource和Delegate的区别

Datasource是告诉使用者之前的View中是有什么东西,有什么属性,属性的值是多少,是只关于数据的东西。

Delegate是告诉使用者之前的View有什么方法可以供我调用。

五、block和代理的区别

首先两者的作用是一样的,都是进行单一回调。不同的是delegate是对象,然后通过对象来调用协议函数来完成操作。block试穿第一个函数指针,利用函数指针执行来进行回调。在内存管理上,delegate不需要保存引用,block对数据有copy处理。

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

属性的组成:@property = ivar + getter + setter 即实例变量+get方法+set方法,也就是说是用@property系统会自动生成set方法和get方法。

以下是一些属性关键字的具体含义

属性关键字

@synthesize和@dynamic区别,在声明property属性后,有两种选择

@synthesize

编译器期间,让编辑器自动生成getter和setter方法,当有自定义的存或取的方法时,自定义的方法会屏蔽掉系统生成的方法。

@dynamic

告诉编辑器,不自动生成getter和setter方法,避免编译期间产生警告,由自己实现存取方法,或者存取方法在运行时动态创建绑定,这种情况主要是用在CoreData的实现NSManagedObject子类时使用,由core data框架在程序运行时动态生成子类属性。

七、属性的默认关键字是什么?

对于基本数据类型默认关键字是atomic,readwrite,assign

对于普通的oc对象是atomic,readwrite,strong

八、NSString为什么要用copy关键字,如果用strong会有什么问题?

使用strong关键字后创造出的对象和原对象的对象地址是一样的,指向同一个对象,而使用copy关键字对象地址是不一样的,是创建了一个新的对象。由此我们可以看到如果原对象的值有了改变使用copy关键字的就会跟随改变因为地址是一样的,而使用strong关键字的就不会跟随改变,因为是新创建的对象,地址是不一样的。

九、如何令自己写的对象具备拷贝功能?

需要实现NSCopying协议,如果自定义的对象分为可变版本和不可变版本,那么就需要同时实现NSCopying和NSMUtableCopying协议。

十、可变集合类和不可变集合类的copy和mutablecopy有什么区别?如果集合是内容复制的话,集合里面的内容也是内容复制吗?

首先我们要明白一个概念,什么是倩复制,单层深复制,完全复制(每一层都深复制)

浅复制就是指针复制,并没有进行对象复制;

单层深复制就是我们常说的深层复制,我们这里说的单层深复制是针对集合类说的(NSArry, NSDictionary,NSSet),单层深复制值得是只复制了该集合类的最外层,里面的元素没有进行复制(即这两个集合类的地址不一样,但是两个集合里所存储的元素的地址是一样的);

完全复制指的是完全复制整个集合类,也就是说两个集合类地址不一样,里面所存储的元素地址也不一样。

[immutableObject copy]//浅复制

[immutableObject mutableCopy]//深复制

[mutableObject copy]//深复制

[mutableObject mutableCopy]//深复制

NSArray*copyArray = [[NSArrayalloc] initWithArray:array copyItems:YES];// 完全复制

十一、为什么IBOutlet修饰的View也是用weak关键字?

因为当我们将控件拖到storyboard上就相当于新创建了一个对象,而这个对象加到视图控制器的View上的,View有一个subviews属性,这个属性是一个数组,而我们加的控件就在这个数组中,那么实际上我们的控件对象是属于View的,也就是说View对加到他上面的控件是强引用。当我们是用outlet属性的时候,我们是在viewcpntroller里面使用,而这个outlet属性是由View强引用的,在viwecontroller里面仅仅是对其使用,并没有必要拥有它,所以是weak。

十二、oc使用什么机制来管理对象内存?

mrc 手动内存管理

arc自动引用计数

garbage collection(垃圾回收) 但是ios不支持垃圾回收,arc作为llvm3.0编译器的一项特性,在ios5.0(xcode4.0)版本后推出。

arc的判断规则是,对象没有强指针指向对象,对象就会被释放。

上一篇下一篇

猜你喜欢

热点阅读