搬运了一些其他网站的,然后自己添加了一些,方便查看。
1、为什么说Objective-C是一门动态的语言?
① 什么是动态语言?
动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)
便是一个动态语言。除此之外如Ruby
、Python
等也都属于动态语言,而C
、C++
等语言则不属于动态语言。
有三个名词容易混淆:
·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模式的意思是,软件可以分成三个部分。

视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据保存
各部分之间的通信方式如下。

1.View 传送指令到 Controller
2.Controller 完成业务逻辑后,要求 Model 改变状态
3.Model 将新的数据发送到 View,用户得到反馈
所有通信都是单向的。
② 、MVP
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过 Presenter 传递。
3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
③ 、MVVM
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。
3.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
为什么代理要用weak
防止循环引用。例如View有一个协议,需要一个代理实现回调。一个Controller
添加这个View
,并且遵守协议,成为View
的代理。如果不用week
,用strong
,Controller ->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
系统会自动生成setter
和getter
方法;
属性默认的关键字
我们经常使用assign
,weak
,strong
,copy
,nonatomic
,atomic
,readonly
等关键字,下面我们列个表格去归纳一下属性关键字具体作用:

@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
网友评论