oc-22-sel

/**
 sel:
 1.作用:包装方法
 2.格式:typedef struct objc_selector *SEL;
 3.用法:
  SEL 名称 = @selector(方法);
  调用形式:
  [对象 performSelector:SEL类型的数据];
 // 判断某个类有没有某个方法
 + (BOOL)instancesRespondToSelector:(SEL)aSelector;
 */
#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
         // 1.包装方法,将方法包装成sel格式
        SEL c = @selector(study);
        // 2.创建对象
        Student *s = [Student new];
        // 3.调用包装好的方法
        [s performSelector:c];
        // 4.判断某个类是否有某个方法
        BOOL res = [Student instancesRespondToSelector:c];
        NSLog(@"%d",res);
    }
    return 0;
}
复制代码

 

注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用 方法。
  • 类中方法存储的原理:

  • 1)类里面的方法都是被转换成SEL变量进行存储的。
  • 2)当类声明一个对象,对象调用方法的时候,系统会把这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。

  • [d run]; ------->SEL 

    • 寻找方法的过程:

    • (1)首先把test这个方法名包装成sel类型的数据;
    • (2)根据SEL数据找到对应的方法地址;
    • (3)根据方法地址调用相应的方法。
    • (4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5310821.html,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值