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. 新版汉诺塔(UVa10795 - A Different Task)

    题目介绍: 标准的汉诺塔上有n个大小各异的盘子.现给定一个初始局面(见图1),求它到目标局面(见图2)至少需要移动多少步? 移动规则:一次只能移动一个盘子:且在移动盘子之前,必须把压在上面的其他盘子先 ...

  2. Linux 简介

    转载:http://c.biancheng.net/cpp/html/2726.html Linux简介 严格的来讲,Linux 不算是一个操作系统,只是一个 Linux 系统中的内核,即计算机软件与 ...

  3. Leetcode H-index

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...

  4. Linux process authority、the security risks in running process with high authority

    catalog . Linux进程权限原理 . 最小权限原则 - 进程降权运行最佳实践 . 进程权限控制包含的攻防向量 . 进程高权限安全风险检查技术方案 1. Linux进程权限原理 我们知道,Li ...

  5. 谈谈favicon和他带来的问题

    favicon.ico介绍 favicon.ico是个什么东西呢,也许见得太多都习以为常了(我就是这样,直到写这篇文章之前才知道),看看维基百科的解释: Favicon是favorites icon的 ...

  6. android 事件传递机制 心得

    看了网上很多资料. 最后我发现可以用很简单的几句话就能把它说清楚 1 每个 viewgroup 内都有 三个方法 a dispatchTouchEvent 是自己决定要不要(管他爹)要这个苹果的 一般 ...

  7. PHP之:PHP编程效率的20个要点

    [导读] 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数” 用单引号 ...

  8. PHP面向对象之朝花夕拾

    虽然平时都在用面向对象的思维编程.但是都是基于框架,很多技术细节一段时间不用就会逐渐模糊.拾遗部分:面向对象的三大特称:继承多态封装. 构造方法.__construct()  构造方法.再new的时候 ...

  9. BZOJ2186: [Sdoi2008]沙拉公主的困惑

    传送门 常规数论题,利用欧拉函数的相关性质. 题求$[1,N!]$中与$M!$互质的数的个数,且$M \leq N$.然后根据欧拉函数的相关性质很容易得出这道题的答案为$\frac{\phi (M!) ...

  10. POJ 3678 Katu Puzzle(强连通 法)

    题目链接 题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子 主要是建图: 对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a ...