SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
  1. @interface Person : NSObject
  2. + (void)test1;
  3. - (void)test2;
  4. @end
  5. // 根据.h文件中定义的Person类和方法 执行完这行代码 在内存中如下
  6. Person *person = [[Person alloc] init];

SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法

1.方法的存储位置

  • 在内存中每个类的方法都存储在类对象中
  • 每个方法都有一个与之对应的SEL类型的数据
  • 根据一个SEL数据就可以找到对应的方法地址,进而调用方法
  • SEL类型的定义:  typedef struct objc_selector *SEL

2.SEL对象的创建

  1. SEL s1 = @selector(test1); // 将test1方法包装成SEL对象 
  2. SEL s2 = NSSelectorFromString(@"test1"); // 将一个字符串方法转换成为SEL对象

3.SEL对象的其他用法

  1. // 将SEL对象转换为NSString对象
  2. NSString *str = NSStringFromSelector(@selector(test));
  3.  Person *p = [Person new];
  4. // 调用对象p的test方法
  5. [p performSelector:@selector(test)];
  1. /******************************* Person.h文件 **********************************/
  2. #import <Foundation/Foundation.h>
  3. @interface Person : NSObject
  4. - (void)test1;
  5. - (void)test2:(NSString *)str;
  6. @end
  7. /******************************* Person.m文件 **********************************/
  8. #import "Person.h"
  9. @implementation Person
  10. - (void)test1
  11. {
  12. NSLog(@"无参数的对象方法");
  13. }
  14. - (void)test2:(NSString *)str
  15. {
  16. NSLog(@"带有参数的方法%@",str);
  17. }
  18. @end
  19. /******************************* main.m文件 **********************************/
  20. #import "Person.h"
  21. #import <Foundation/Foundation.h>
  22. /*
  23. 调用方法有两种方式:
  24. 1.直接通过方法名来调用
  25. 2.间接的通过SEL数据来调用
  26. */
  27. int main(int argc, const char * argv[])
  28. {
  29. Person *person = [[Person alloc] init];
  30. // 1.执行这行代码的时候会把test2包装成SEL类型的数据
  31. // 2.然后根据SEL数据找到对应的方法地址(比较耗性能但系统会有缓存)
  32. // 3.在根据方法地址调用对应的方法
  33. [person test1];
  34. // 将方法直接包装成SEL数据类型来调用 withObject:传入的参数
  35. [person performSelector:@selector(test1)];
  36. [person performSelector:@selector(test2:) withObject:@"传入参数"];
  37. return 0;
  38. }

【编辑推荐】

iOS开发 关于SEL的简单总结的更多相关文章

  1. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  2. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  3. iOS开发UI篇—Modal简单介绍

    iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...

  4. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  5. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  6. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  7. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  8. iOS开发UI篇—Quartz2D简单介绍

    iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...

  9. iOS开发UI篇—Quartz2D简单使用(一)

    iOS开发UI篇—Quartz2D简单使用(一) 一.画直线 代码: // // YYlineview.m // 03-画直线 // // Created by apple on 14-6-9. // ...

随机推荐

  1. Collection小结

    Collection:

  2. BestCoder 2nd Anniversary

    A题 Oracle http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=703&pid=1001 大数相加: ...

  3. 我认识的log4j开源日志

    Log4j 在java中如何配置log4j!! 步骤: ①引入jar包,推荐新建一个lib文件夹,用来装所有的jar包(还要进行下图内的操作) 之后项目中就会多出一个引入外部Library的项目 ②创 ...

  4. Android apk集成

    刚开始学习Android,对很多东西都不懂,所以以下是我做的第一件事,记录一下,也就是apk的集成: 我们集成的apk是已经签过名的第三方apk,并且需要集成到system/priv-app目录下,过 ...

  5. delphi 相对路径

    ..代表上级目录 .代表当前目录 \代表目录分隔 ..\..\表上上一级目录

  6. [codeforces 293]B. Distinct Paths

    [codeforces 293]B. Distinct Paths 试题描述 You have a rectangular n × m-cell board. Some cells are alrea ...

  7. OC中@property属性关键字的使用(assign/weak/strong/copy)

    OC中@property属性关键字的使用(assign/weak/strong/copy) 一.assign 用于 ‘基本数据类型’.‘枚举’.‘结构体’ 等非OC对象类型 eg:int.bool等 ...

  8. javascript实现单例模式

    1.简单实现单例模式: var singleTon = function(){ var _pria = 'private value'; var show_pria = function(){ con ...

  9. VMware系统运维(九)VMware vSphere Client 安装

    1.点击下一步 2.接受协议,下一步 3.选择安装位置,下一步 4.开始安装 5.安装完成,进行登录测试. VMware vsphere 5.1 登录名为administrator    VMware ...

  10. JavaScript 正则表达式相关理解

    1.使用正则的test.exec方法而且带有g属性进行连续匹配的时候, 如果每次匹配之前 lastIndex属性没有清零. <script> var str='123qweQWE125|2 ...