求婚时,想给女友买颗好钻戒,
那颗他曾参与撰写文案的优雅钻戒,
承载着他的所有想象和创造力,
很多人被他的文案打动,而他自己却买不起。
他曾用最动情最直击人心的文案,
写过冰川和沙漠,大海和鲨鱼,
那些在他脑海中闪现过无数遍的自由美景,
他自己从没有时间去。
他的梦想:从你的全世界路过
于是他,转行了,做了iOS开发人
OC和C最本质的区别:
C语言 编译的时候,就知道你等下会调用哪一个函数!!
OC 编译的时候,其实不知道你要调用哪一个方法!!
C语言 是面向过程的编程语言
OC 则是面向对象的编程语言。
面向对象编程的代码更容易维护。它把具体的操作细节封装在类里,用的时候创建个对象,一顿调用方法,搞定!(当然类的实现方法还是需要自己写,面向对象只是一种编程思想。)
OC继承、或者说是拓展于C语言,OC里可以直接写C语言的代码,这是OC的向下兼容。
OC的底层是消息发送机制,在编译的时候是不知道调用的方法是否存在,只有在运行时才去找,找不到才报错。
今天就来讲讲OC的消息发送机制
1. 消息发送机制-不带参数的对象方法
新建一个工程,建一个Person类,写一个对象方法run方法
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)run;
@end
#import "Person.h"
@implementation Person
-(void)run
{
NSLog(@"哥么跑起来了");
}
@end
将Person引入ViewController,开始玩消息发送机制
#import "ViewController.h"
#import "Person.h"
//引入message就行了,因为message包含runtime
#import <objc/message.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person * p = [[Person alloc]init];
//Xocde 5.0之后,苹果不建议使用底层的函数
//给p 发送一个消息
objc_msgSend(p, @selector(run));
}
@end
注意:Xocde 5.0之后,苹果不建议使用底层的函数,用objc_msgSend函数会报错
image.png更改如下配置就可以了
image.png改好了以后运行程序
image.png就调用了Person的run方法
2. 消息发送机制-带参数的对象方法
在Person中再添加一个带参数的方法
@interface Person : NSObject
-(void)run;
-(void)eatWithFood:(NSString *)food;
@end
#import "Person.h"
@implementation Person
+(void)run
{
NSLog(@"类方法在跑");
}
-(void)eatWithFood:(NSString *)food
{
NSLog(@"吃%@",food);
}
@end
image.png
看objc_msgSend后面的...
说明可以用逗号分隔来穿参数,在ViewController如下写
#import "ViewController.h"
#import "Person.h"
//引入message就行了,因为message包含runtime
#import <objc/message.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person * p = [[Person alloc]init];
//Xocde 5.0之后,苹果不建议使用底层的函数
//给p 发送一个消息
// objc_msgSend(p, @selector(run));
//参数用逗号隔开
objc_msgSend(p, @selector(eatWithFood:),@"香蕉");
}
运行,结果如下
image.png3. 消息发送机制-类方法
在Person中如下写
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)run;
-(void)eatWithFood:(NSString *)food;
+(void)run;
@end
#import "Person.h"
@implementation Person
+(void)run
{
NSLog(@"类方法在跑");
}
-(void)eatWithFood:(NSString *)food
{
NSLog(@"吃%@",food);
}
-(void)run{
NSLog(@"哥么跑起来了");
}
@end
在ViewController如下写
#import "ViewController.h"
#import "Person.h"
//引入message就行了,因为message包含runtime
#import <objc/message.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//OC 调用类方法 Class类型它也是一个特殊的对象!!
// [Person run];
Class personClass = [Person class];
//运行时
objc_msgSend(personClass, @selector(run));
}
这样可以吗,事实证明是可以的
image.pngClass类型它也是一个特殊的对象!!
提供一份Demo,希望对你有帮助
想了解更多RunTime,可以参考:
Runtime 交换方法
Runtime 消息转发机制
写在最后:
希望这篇文章对您有帮助,最好就是实操一边,这样才能理解更深入。
当然如果您发现有可以优化的地方,希望您能慷慨的提出来。
最后祝您工作愉快!
网友评论