美文网首页iOS知识
OC和传统的面向对象语言有什么区别和优势

OC和传统的面向对象语言有什么区别和优势

作者: 一个人在路上走下去 | 来源:发表于2018-08-05 17:04 被阅读77次

    首先是写法的不同,OC中方法的实现只能写在@implementation··@end中,对象方法的声明只能写在@interface···@end中间;对象方法都以-号开头,类方法都以+号开头;对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用。函数属于整个文件,可以写在文件中的任何位置,包括@implementation··@end中,但写在@interface···@end会无法识别,函数的声明可以在main函数内部也可以在main函数外部。对象方法归类\对象所有;函数调用不依赖于对象;函数内部不能直接通过成员变量名访问对象的成员变量。

    Objective-C的运行时是动态的,它能让你在运行时为类添加方法或者去除方法以及使用反射。 OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。

    动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在编译的时候就能被识别出来。所以,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时跟运行时。

    动态绑定(dynamic binding)需要用到@selector/SEL。先来看看“函数”,对于其他一些静态语言,比如c++,一般在编译的时候就已经将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。而在OC中,其实是没有函数的概念的,我们叫“消息机制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调用什么方法,需要传什么参数进去。这就是动态绑定,要实现他就必须用SEL变量绑定一个方法。最终形成的这个SEL变量就代表一个方法的引用。这里要注意一点:SEL并不是C里面的函数指针,虽然很像,但真心不是函数指针。SEL变量只是一个整数,他是该方法的ID。以前的函数调用,是根据函数名,也就是字符串去查找函数体。但现在,我们是根据一个ID整数来查找方法,整数的查找字自然要比字符串的查找快得多!所以,动态绑定的特定不仅方便,而且效率更高。

    动态加载就是根据需求动态地加载资源,在运行时加载新类。在运行时创建一个新类,只需要3步:
    1、为 class pair分配存储空间 ,使用 objc_allocateClassPair函数
    2、增加需要的方法使用class_addMethod函数,增加实例变量用class_addIvar
    3 、用objc_registerClassPair函数注册这个类,以便它能被别人使用。

    使用这些函数请引#import <objc/runtime.h>

    相关文章

      网友评论

        本文标题:OC和传统的面向对象语言有什么区别和优势

        本文链接:https://www.haomeiwen.com/subject/mhwbvftx.html