iOS干货

iOS runtime 运行时(一)

RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 )。编译完成之后直接顺序执行,无任何二义性。OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

1).运行时– 直到程序运行时才去确定一个对象的具体信息,并且可以改变这个类的具体信息,包括它的方法,变量等等;

2).编译时– 是在程序运行之前,编译的时候,就确定了这个对象的具体信息,并且不可改变

先来说说,运行时,确定一个对象的具体信息的例子

NSString *str = [NSArray arrayWithObject:@"3"];
NSLog(@"%ld",str.length);

这两句 代码,在Xcode里是可以编译成功,不会报错,但会有警告,运行的时候会崩溃,这就体现了,运行时 才会确定str 这个指针指向的对象的类型

编译时,str 是被当做 字符串 来进行处理的,运行的时候,就要访问str真正指向的对象,数组,所以 数组调用 length 的方法,就会抛出一个找不到该方法的异常,崩溃掉了呢

再举一个例子:

#import <Foundation/Foundation.h>
@interface RTObj :NSObject
-(void)sort;
@end


#import "RTObj.h"
@implementation RTObj
@end

这样的一个类,.h 文件里声明了一个方法,.m 里并没有实现这个方法,.m 会有一个提示的警告

如果我这样 编写代码

RTObj *obj = [[RTObj alloc] init];
[obj sort];

这两句代码在编译时,程序运行之前是不会有任何问题的,警告都不会存在,但是运行的时候,会因为找不到这个方法 而崩溃

这样我们就简单的了解了下 运行的时候 确定 这个对象的 具体信息的概念,希望对大家有帮助,下一篇文章我们会探讨 改变!

如果你有不同的见解,欢迎留言吐槽。

发表评论

邮箱地址不会被公开。 必填项已用*标注