SEL(数据类型)代表方法,一个SEL数据代表一个方法 方法是存在类中还是对象中? 类中
SEL这个涉及到oc中的运行时机制 这种类型的数据就代表着方法
person *p = [person alloc] init]; 这行代码过后 首先会分配存储空间给这个person这个类 在类里面每个方法都有一个跟它相对应的sel数据 sel s1 = - (void)test s1是个数据来着,其实你可以把它当对象也可以。 每个对象里面都有一个isa指针指向它的类。 【p test】 找方法怎么找的。首先是把我们的test方法包装成sel类型的数据,然后通过isa找到我们的类里面,看下我们的sel 里面对应的是哪一个方法。根据sel就可以找到那个方法,其实sel里面对应的严格来说是我们的方法地址。 就是说 先把test方法包装成sel,再拿着sel去我们的类里面找,看我们的sel对应的是哪个方法。有了方法地址就可以调用我们的方法了。所以sel做什么事情的呢,就是我们方法的包装数据类型。而且这个操作是有缓存的,当第一次拿着sel去找方法的时候,它会挨个找一下sel对应哪一个东西,一个一个找,非常耗性能。当找过之后呢,以后去找的时候,它就会立刻使用上一次的查询结果。
sel有什么价值呢?
sel就是selector 我们调用某个方法给它发消息其实就是发送 sel类型的数据,我是根据sel类型的数据去内存中找对应的方法。其实发消息发送的就是sel,你把方法名包装成一个sel类型的消息,发送给我们到这里(类里面),发送到这里之后,就根据sel去找对应的方法
怎么来创建sel类型数据呢? SEL s = @selector(test); 是代表利用@selector(test)这个指令创建出test这个方法对应是sel数据。那么有了这个数据,我们通过间接一传,那么就可以调用这个方法
总结:SEL其实就是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法。
这其实就是我们的消息机制,所以传说中的发消息,就是发送一个sel类型的数据。根据发送的sel去内存中找到方法
|
|