Objective-C 和其他语言的不同

Posted by CoderLeonidas on October 24, 2019

Objective-C 和其他语言的不同

先说4个概念:动态语言 & 静态语言 & 动态类型语言 & 静态类型语言

动态和静态语言主要看的是程序在运行期间能不能改变代码的结构,主要看的是代码结构

动态类型和静态类型语言主要看的是数据类型检查(绑定)发生在编译期还是运行期,看的是数据类型

  • 动态语言 dynamic programming language 程序运行时,允许改变程序结构(例如引进新函数、删除旧函数)或变量类型。 从这个观点来看,Perl、Python、Ruby、OC是动态语言,C++、Java、C#不是动态语言

  • 动态类型语言 dynamically typed language 在运行期检查变量类型的语言,也就是在编写代码的时候可以不指定变量的数据类型,例如Python、Ruby、OC。动态类型语言中,变量没有类型,而值有类型

  • 静态类型语言 statically typed language 变量的数据类型在编译期声明以后,不能再改变其数据类型,即变量在使用前必须先声明类型。检查在编译期进行,好处是编译期提前检查可能出现的错误,例如C++、Java

C的特点:

  • 1)C语言是结构化语言,层次清晰,调试和维护比较容易
  • 2)表现能力和处理能力比较强,可直接访问内存的物理地址
  • 3)c语言实现对硬件的编辑,c语言课用语系统软件的开发,也可用语应用软件的开发,是集高级语言和低级语言的功能一体。
  • 4)C语言效率高,可移植性强。

C++的特点:

  • 1、在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;
  • 2、可以使用抽象数据类型进行基于对象的编程;
  • 3、可以使用多继承、多态进行面向对象的编程;
  • 4、可以担负起以模版为特征的泛型化编程。

OC的特点:

  • 1、Objective-C,扩展了C 语言使它具备面向对象设计的能力,例如类、消息、继承、封装、多态;同时在Objective-C的代码中可以有C和C++语句,它可以调用C的函数,也可以通过C++对象访问方法;
  • 2、Objective-C可以实现底层系统编程,另一方面可以支持利用动态架构进行开发。

  • 3、他具有静态语言的特性(如C++),又有动态语言的特性,表现为了三个方面:动态类型、动态绑定、动态加载。

(1)动态类型 动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在编译的时候就能被识别出来。所以,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时跟运行时。基本的动态特性在常规的Cocoa开发中非常常用,特别是动态类型和动态绑定。由于Cocoa程序大量地使用Protocol-Delegate的 设计模式,因此绝大部分的delegate指针类型必须是id,以满足运行时delegate的动态替

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

(3)动态加载 根据需求加载所需要的资源,这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x 的图片,而在老一些的普通屏设备上加载原图。随着Retina iPad的推出,和之后可能的Retina Mac的出现,这个特性相信会被越来越多地使用。

Swift的特点:

  • 1 Swift是强类型语言,变量的类型明确,变量的赋值必须符合类型约束;变量的类型转化必须显式进行。
  • 2 Swift支持函数式编程、面向对象编程和面向协议编程
  • 3 Swift更注重值类型的数据结构,而oc遵循c语言的老一套,注重指针和索引
  • 4 Swift是静态类型语言,而oc是动态类型语言
  • 5 Swift也有运行时

Swift相比于比Objective-C的优势:

  • 1 Swift容易阅读,语法和文件结构简易化。

  • 2 Swift更易于维护,文件分离后结构更清晰。

  • 3 Swift更加安全,它是类型安全的语言。

  • 4 Swift代码更少,简洁的语法,可以省去大量冗余代码

  • 5 Swift速度更快,运算性能更高。

OC与C的区别:

OC里中兼容C语言的语法可以两者混合编码。 OC是面向对象的,有类,对象的概念,C语言没有,C是面向过程的语言

OC与C++的区别:

1、继承:Objective-C与不支持多重继承,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);

2、函数调用:Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用

3、定型:Objective-C是动态定型。所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。而C++,对象的静态类型决定你是否可以发送消息给它。

4、接口:Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。

5、方法重载:c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。而Objective-C中不完全支持重载。OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同,需要用到__attribute__((overloadable))才能实现,否则会编译报错。

1
2
3
4
5
6
NSString * __attribute__((overloadable)) mytest(NSString *x) {return @"aa";}

NSString * __attribute__((overloadable)) mytest(NSNumber *x) {return @"bb";}

NSString * __attribute__((overloadable)) mytest(NSDictionary *x) {return @"cc";}

6、OC支持动态类型、动态绑定、动态加载

7、OC支持类别

8、OC可以混编C语言、C++

9、OC不支持命名空间