iOS开发 关于SEL的简单总结
- @interface Person : NSObject
- + (void)test1;
- - (void)test2;
- @end
- // 根据.h文件中定义的Person类和方法 执行完这行代码 在内存中如下
- Person *person = [[Person alloc] init];

SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法
1.方法的存储位置
- 在内存中每个类的方法都存储在类对象中
- 每个方法都有一个与之对应的SEL类型的数据
- 根据一个SEL数据就可以找到对应的方法地址,进而调用方法
- SEL类型的定义: typedef struct objc_selector *SEL
2.SEL对象的创建
- SEL s1 = @selector(test1); // 将test1方法包装成SEL对象
- SEL s2 = NSSelectorFromString(@"test1"); // 将一个字符串方法转换成为SEL对象
3.SEL对象的其他用法
- // 将SEL对象转换为NSString对象
- NSString *str = NSStringFromSelector(@selector(test));
- Person *p = [Person new];
- // 调用对象p的test方法
- [p performSelector:@selector(test)];
- /******************************* Person.h文件 **********************************/
- #import <Foundation/Foundation.h>
- @interface Person : NSObject
- - (void)test1;
- - (void)test2:(NSString *)str;
- @end
- /******************************* Person.m文件 **********************************/
- #import "Person.h"
- @implementation Person
- - (void)test1
- {
- NSLog(@"无参数的对象方法");
- }
- - (void)test2:(NSString *)str
- {
- NSLog(@"带有参数的方法%@",str);
- }
- @end
- /******************************* main.m文件 **********************************/
- #import "Person.h"
- #import <Foundation/Foundation.h>
- /*
- 调用方法有两种方式:
- 1.直接通过方法名来调用
- 2.间接的通过SEL数据来调用
- */
- int main(int argc, const char * argv[])
- {
- Person *person = [[Person alloc] init];
- // 1.执行这行代码的时候会把test2包装成SEL类型的数据
- // 2.然后根据SEL数据找到对应的方法地址(比较耗性能但系统会有缓存)
- // 3.在根据方法地址调用对应的方法
- [person test1];
- // 将方法直接包装成SEL数据类型来调用 withObject:传入的参数
- [person performSelector:@selector(test1)];
- [person performSelector:@selector(test2:) withObject:@"传入参数"];
- return 0;
- }
【编辑推荐】
iOS开发 关于SEL的简单总结的更多相关文章
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
- iOS开发UI篇—Modal简单介绍
iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
- iOS开发UI篇—Kvc简单介绍
ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- iOS开发UI篇—UIWindow简单介绍
iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...
- iOS开发UI篇—Quartz2D简单介绍
iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...
- iOS开发UI篇—Quartz2D简单使用(一)
iOS开发UI篇—Quartz2D简单使用(一) 一.画直线 代码: // // YYlineview.m // 03-画直线 // // Created by apple on 14-6-9. // ...
随机推荐
- 【codevs1907】 方格取数 3
http://codevs.cn/problem/1907/ (题目链接) 题意 N*N的方格,每个格子中有一个数,从中取出不相邻的任意个数,使得取到的数的和最大. Solution 裸的二分图带权最 ...
- ConvertHelper类
/// <summary> /// 处理数据类型转换,数制转换.编码转换相关的类 /// </summary> public sealed class ConvertHelpe ...
- 何解決 LinqToExcel 發生「無法載入檔案或組件」問題何解決 LinqToExcel 發生「無法載入檔案或組件」問題
在自己的主機上透過 Visual Studio 2013 與 IISExpress 開發與測試都還正常,但只要部署到測試機或正式機,就是沒辦法順利執行,卡關許久之後找我協助.我發現錯誤訊息確實很「一般 ...
- BZOJ2038 小z的袜子
题意:给一些数,然后每次询问一段区间,问从这个区间中抽走两个数,抽到相同的数的概率 正解:莫队算法 今天新学习了莫队算法,感觉好神,离线的询问好像都可以用莫队. 要不是坑爹的HNOI2016考了两道莫 ...
- DIV横排/竖排滚动(white-space/::-webkit-scrollbar的使用技巧以及display: inline-block的选择)支持手势
参考微信的京东客户端http://wqs.jd.com/,实现DIV的横排滚动,且支持手势,并且不会出现滚动跳,效果如下: 但是观察其div结构是没有使用任何JS去实现. 一.实现上DIV的横排 观察 ...
- Servlet与JSP版本历史以及Tomcat支持的版本
查询这个的关键字:Java EE的版本历史. JavaServer Pages (JSP) Java Servlet 参考: https://en.wikipedia.org/wiki/Java_EE ...
- POJ 1061青蛙的约会(拓展欧几里德算法)
题目链接: 传送门 青蛙的约会 Time Limit: 1000MS Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...
- 分布式服务框架Zookeeper
协议介绍 zookeeper协议分为两种模式 崩溃恢复模式和消息广播模式 崩溃恢复协议是在集群中所选举的leader 宕机或者关闭 等现象出现 follower重新进行选举出新的leader 同时集群 ...
- Beta版本——第七次冲刺博客
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- JavaScript杂谈(顺便也当知识积累)
JavaScript版本 JavaScript的普及使得其于1997年正式成为国际标准,其官方名称为ECMAScript 1999年定稿第三版ECMAScript标准,简称ES3 2009年重大改进的 ...