iOS~runtime初览

首先推荐几篇好的文章:
Objective-C总Runtime的那点事儿(一)消息机制

对runtime一直不甚理解,但是很多时候看到别人的代码里面用到,虽然自己基本没有直接的用到过,但是runtime对于我们理解和学习oc语言来说还是很重要的,所以打算用自己肤浅的知识去了解与学习这块内容,也希望大牛们能给予指导。

Objective-C 是面相运行时的语言(runtime oriented language)

官方文档是这么说的

The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work.

上面的描述是:Objective-C 它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。也就是说,它是动态的做事。意味着Objective-C不仅仅需要的是一个编译器,而且还需要一个运行时系统去执行编译代码。在Objective-C里面运行时系统伴随着可以作为一个操作系统,它就是这样让Objective-C工作的。

这就给了你很大的灵活性,你可以按需要把消息重定向给合适的对象,你甚 至可以交换方法的实现,等等。
在 Objective-C 中调用一个对象的方法可以看成向一个对象发送消息,这就需要使用 runtime,runtime 可以做对象自省查看他们正在做的和不能做的并且合适的分发消息

比如OC中的语言是这样的:

[self doSomethingWithVar:var];

然后被转化为

objc_msgSend(self,@selector(doSomethingWithVar:),var);

所以,Objective-C 的 Runtime 是一个运行时库(Runtime Library),它是一个主要使用 C 和汇编写的库,为 C 添加了面相对象的能力并创造了 Objective-C。这就是说它在类信息(Class information) 中被加载,完成所有的方法分发,方法转发,等等。Objective-C runtime 创建了所有需要的结构体,让 Objective-C 的面相对象编程变为可能。

Instance Method(实例方法):以 ‘-’ 开始,比如 -(void)doFoo; 在对象实例上操作。Class Method(类方法):以 ‘+’ 开始,比如 +(id)alloc。方法(Methods)和 C 的函数很像,是一组代码,执行一个小的任务,如:

- (NSString *)tellMe
{
    return @"Hello, tell me who you are";
}

Selector 在 Objective-C 中 selector 只是一个 C 的数据结构,用于表示一个你想在一个对象上执行的 Objective-C 方法。在 runtime 中的定义像这样…

typedef struct objc_selector  *SEL;

像这样使用…

SEL aSel = @selector(tellMe);

Message(消息)

[target tellMeObject:obj];

消息是方括号 ‘[]’ 中的那部分,由你要向其发送消息的对象(target),你想要在上面执行的方法(method)还有你发送的参数(arguments)组成。 Objective-C 的消息和 C 函数调用是不同的。事实上,你向一个对象发送消息并不意味着它会执行它。Object(对象)会检查消息的发送者,基于这点再决定是执行一个不同的方法还是转发消息到另一个目标对象上。Class 如果你查看一个类的runtime信息,你会看到这个…

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

这里有几个事情。我们有一个 Objective-C 类的结构体和一个对象的结构体。objc_object 只有一个指向类的 isa 指针,就是我们说的术语 “isa pointer”(isa 指针)。这个 isa 指针是当你向对象发送消息时,Objective-C Runtime 检查一个对象并且查看它的类是什么然后开始查看它是否响应这些 selectors 所需要的一切。最后我么看到了 id 指针。默认情况下 id 指针除了告诉我们它们是 Objective-C 对象外没有其他用了。当你有一个 id 指针,然后你就可以问这个对象是什么类的,看看它是否响应一个方法,等等,然后你就可以在知道这个指针指向的是什么对象后执行更多的操作了。

类在runtime中的表现形式:

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class OBJC2_UNAVAILABLE;
    const char *name OBJC2_UNAVAILABLE;
    long version OBJC2_UNAVAILABLE;
    long info OBJC2_UNAVAILABLE;
    long instance_size OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
    struct objc_cache *cache OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;

待补充内容…

/// An opaque type that represents a method in a class definition.
typedef struct objc_method *Method; 
用来描述类中定义的方法

/// An opaque type that represents an instance variable.
typedef struct objc_ivar *Ivar;
//用来描述一个实例变量

/// An opaque type that represents a category.
typedef struct objc_category *Category;
//用来描述一个分类

/// An opaque type that represents an Objective-C declared property.
typedef struct objc_property *objc_property_t;
//用来描述一个oc的属性

Instance Method(实例方法):以 ‘-’ 开始,比如 -(void)doFoo; 在对象实例上操作。Class Method(类方法):以 ‘+’ 开始,比如 +(id)alloc。方法(Methods)和 C 的函数很像,是一组代码,执行一个小的任务,如:

//待续
参考文献:
理解 Objective-C Runtime

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值