iOS最新面试锦集

搬运了一些其他网站的,然后自己添加了一些,方便查看。

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

① 什么是动态语言?

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

有三个名词容易混淆:
·Dynamic Programming Language (动态语言或动态编程语言)
·Dynamically Typed Language   (动态类型语言)
·Statically Typed Language    (静态类型语言)

所谓的动态类型语言,意思就是类型的检查是在运行时做的。

② 静态类型

而静态类型语言的类型判断是在运行前判断(如编译阶段),比如C#Java就是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,所以一般动态语言都会采用dynamic typing,常出现于脚本语言中.需要明确说明一点,那就是,是不是动态类型语言与这门语言是不是类型安全的完全不相干的,不要将它们联系在一起!
优缺点:
静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了。动态类型语言的优点在于方便阅读,不需要写非常多的类型相关的代码;缺点自然就是不方便调试,命名不规范时会造成读不懂,不利于理解等。

③ Objective-C的动态运行性

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

动态类型

如id类型。实际上静态类型因为其固定性和可预知性而使用得更加广泛。静态类型是强类型,而动态类型属于弱类型。运行时决定接收者。
这里补充讲一下强、弱类型:语言有无类型、强类型和弱类型三种。无类型的不做任何检查,甚至不区分指令和数据;弱类型的检查很弱,仅能区分指令和数据;强类型的严格在编译期进行检查。强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作

动态绑定

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

动态载入

让程序在运行时添加代码模块以及其他资源。用户可以根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件。可执行代码中可以含有和程序运行时整合的新类。
对象是运行时类的一个实例。在类里声明了的实例变量和方法,它的每个实例都在内存中拥有同样的实例变量,以及指向那些方法的指针。在oc中对象永远是通过指针来引用的。

2.讲一下MVC和MVVM,MVP?

① 、MVC

MVC模式的意思是,软件可以分成三个部分。

MVC.png
视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据保存

各部分之间的通信方式如下。


image.png
1.View 传送指令到 Controller
2.Controller 完成业务逻辑后,要求 Model 改变状态
3.Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的。

② 、MVP

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。


MVP.png
1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过 Presenter 传递。
3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

③ 、MVVM

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

MVVM.png

唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。AngularEmber 都采用这种模式。

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

为什么代理要用weak

防止循环引用。例如View有一个协议,需要一个代理实现回调。一个Controller添加这个View,并且遵守协议,成为View的代理。如果不用week,用strongController ->View -> delegate -> Controller,就循环引用了。

代理属性都用weak或是assign修饰, 现整理下weak(assign)strong(retain)修饰区别:

@property (nonatomic, weak) id delegate;
weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。

@property (nonatomic, strong) id delegate;
strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain MainVC)

Datasource和Delegate两者的区别:

Datasource 是在告诉使用者之前的view中都有什么东西,有什么属性啊,属性的值都是多少,是只关于数据的东西。
Delegate 是在告诉使用者之前的view有什么方法可以供我调用。
一个是数据,一个是操作。

block和代理的区别:

blcok可以看一下这篇文章
首先两者作用是一样的,都是进行单一回调。不同的是,delegate是个对象,然后用过一个对象自己调用代理协议函数来完成整个流程。block是传递一个函数指针,利用函数指针执行来进行回调。还有在内存管理上需要注意,delegate不需要保存引用。block对引用数据有copy的处理。

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

@property 属性的本质

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

属性默认的关键字

我们经常使用assign,weak,strong,copy,nonatomic,atomic,readonly等关键字,下面我们列个表格去归纳一下属性关键字具体作用:

image.png

@synthesize和@dynamic区别, 在声明property属性后,有2种实现选择:

@dynamic关键字和@synthesize关键字

@synthesize

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

@dynamic

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

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

对于基本数据类型默认关键字是:atomic,readwrite,assign
对于普通的OC对象:atomic,readwrite,strong

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

http://blog.csdn.net/huang512715681/article/details/73293357

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,328评论 30 472
  • 基础 1. 为什么说Objective-C是一门动态的语言? 2. 讲一下MVC和MVVM,MVP? 3. 为...
    波妞和酱豆子阅读 8,640评论 0 46
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 6,210评论 0 7
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 6,094评论 0 12
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 7,096评论 0 35