Objective-C是动态语言

前言
C语言是静态语言,它的工作方式是通过函数调用,这样在编译时我们就已经确定程序如何运行的。而Objective-C是动态语言,它并非通过调用类的方法来执行功能,而是给对象发送消息,对象在接收到消息之后会去找匹配的方法来运行。这种做法就把C语言在编译时的工作挪到了运行时来做,可以获得额外的灵活性。
简单理解呢,就是你调用一个方法,但它最终调用的实现是可以改变的,而且你可以在运行时给类添加方法。

添加类不存在的方法
下面的代码定义了两个按钮的响应事件,如果直接点击第一个按钮,那么程序会奔溃,报错提示找不到方法,而如果先点击第二个按钮,那么再点击第一个按钮也不好奔溃了,相反sayHello函数得到了调用。
void sayHello(id self, SEL _cmd){ NSLog(@"hello !");}- (IBAction)btnClicked:(id)sender { [self performSelector:@selector(sayHello2)];}- (IBAction)swizzlingBtnClicked:(id)sender { class_addMethod([self class], @selector(sayHello2), (IMP)sayHello, "v@:");}

这里提一句,Obj-C的方法 (method)就是一个至少需要两个参数(self,_cmd)的C函数,这个函数仅仅输出一句Hello。接下来在addMethod方法中,我们调 用class_addMethod()为类添加方法,class_addMethod()是这样定义的:
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)参数说明:cls:被添加方法的类name:可以理解为方法名,这个貌似随便起名,比如我们这里叫sayHello2imp:实现这个方法的函数types:一个定义该函数返回值类型和参数类型的字符串

下面举一个例子来讲一下上面的types
int say(id self, SEL _cmd, NSString *str) { NSLog(@"%@", str); return 100;//随便返回个值 }class_addMethod这句就应该这么写:1class_addMethod([EmptyClass class], @selector(say:), (IMP)say, "i@:@");其中types参数为"i@:@“,按顺序分别表示:i:返回值类型int,若是v则表示void@:参数id(self)::SEL(_cmd)@:id(str)

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

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,824评论 0 9
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,236评论 0 7
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 774评论 0 2
  • 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的...
    lylaut阅读 831评论 0 4
  • 文中的实验代码我放在了这个项目中。 以下内容是我通过整理[这篇博客] (http://yulingtianxia....
    茗涙阅读 955评论 0 6