OC中的SEL解析
OC中的SEL对象即selector对象,用来保存一个方法的地址。下面通过一个Demo来解析SEL的原理。创建一个Person类,Person.h中:
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int age;
@protected
float height;
}
@property int age; // 编译器自动解释成 int age的get/set方法
- (void)say;
- (void)testSEL;
@end
Person.m中:
#import "Person.h"
@implementation Person
@synthesize age; //编译器自动解释成 age的get、set方法实现
- (void)say
{
NSLog(@"调用了say方法");
}
- (void)testSEL
{
SEL say1 = @selector(say); // 创建say方法的SEL对象
SEL say2 = NSSelectorFromString(@"say"); // 从方法名字符串 创建SEL对象
[self performSelector:say1]; // 执行say1指向的方法
[self performSelector:say2]; // 执行say2指向的方法
/*
以下可以作为Log输出
*/
NSLog(@"------------------------------------------------");
SEL s = _cmd; // 每一个方法内都有一个_cmd,表示方法自身
NSLog(@"当前方法(NSStringFromSelector):%@", NSStringFromSelector(s)); // NSStringFromSelector 返回方法名
NSLog(@"所在文件完整路径(__FILE__):%s", __FILE__);
NSLog(@"所在文件名:%@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent]);
NSLog(@"当前行号(__LINE__):%d", __LINE__);
NSLog(@"当前方法签名(__func__):%s", __func__);
NSLog(@"当前方法签名(__PRETTY_FUNCTION__):%s", __PRETTY_FUNCTION__); // 在c++代码中,会包含类型的详细信息
NSString *clz = NSStringFromClass([Person class]); // 返回一个Class对象的类名
NSLog(@"当前类名(NSStringFromClass):%@", clz);
NSLog(@"%@", [NSThread callStackSymbols]); // 返回当前调用栈信息
}
@end
main.m中:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
[[Person new] testSEL];
}
return 0;
}
结果为:
2016-05-28 19:20:57.384 SELDemo[3657:25679] 调用了say方法
2016-05-28 19:20:57.384 SELDemo[3657:25679] 调用了say方法
2016-05-28 19:20:57.384 SELDemo[3657:25679] ------------------------------------------------
2016-05-28 19:20:57.384 SELDemo[3657:25679] 当前方法(NSStringFromSelector):testSEL
2016-05-28 19:20:57.385 SELDemo[3657:25679] 所在文件完整路径(__FILE__):/Users/lile/Desktop/SELDemo/SELDemo/Person.m
2016-05-28 19:20:57.385 SELDemo[3657:25679] 所在文件名:Person.m
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前行号(__LINE__):34
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前方法签名(__func__):-[Person testSEL]
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前方法签名(__PRETTY_FUNCTION__):-[Person testSEL]
2016-05-28 19:20:57.385 SELDemo[3657:25679] 当前类名(NSStringFromClass):Person
2016-05-28 19:20:57.385 SELDemo[3657:25679] (
0 SELDemo 0x0000000100001ba6 -[Person testSEL] + 502
1 SELDemo 0x0000000100001c7e main + 78
2 libdyld.dylib 0x00007fff9f3055ad start + 1
)
OC中的SEL解析的更多相关文章
- QF——OC中的SEL类型和Block
@selector(): 可以理解@selector()就是取类方法的编号,他的基本行为类似于C语言中的函数指针(指向函数的指针).它们通过传递方法的地址(或编号)来实现把方法当做参数的效果. 不过在 ...
- OC中SEL,类别,继承,协议的使用
1.SEL SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法.我们在后面的UI中会经常用selector来调用事件方法.下面我将举两个例子来说明 ...
- OC中Runtime浅析
近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...
- [BS-21] 关于OC中对象与指针的思考
关于OC中对象与指针的思考 1. 创建对象: OC中可通过代码Person *p = [[Person alloc] init];创建了一个对象p.该过程中内存情况为: 在当前线程的栈(默认1M)中, ...
- 关于 self 和 super 在oc 中 的疑惑 与 分析
关于 self 和 super 在oc 中 的疑惑 与 分析 面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写 代码,网上那么多资料. 区分高低也就是研究的深度和广度 ...
- iOS开发中的Html解析方法
iOS开发中的Html解析方法 本文作者为大家介绍了在iOS开发中的Html解析方法,并同时提供了Demo代码的下载链接,Demo 解析了某个网站(具体可在代码中查看)的html网页,提取了图片以及标 ...
- oc中的反射机制
好久没有总结过了,一直在赶项目... 今天来总结一下OC中的反射机制,有什么不对的地方,还请多多海涵. 反射机制,简单的说就是在程序运行期间通过类的名字来动态的获取类的信息,从而实现动态的创建类,以及 ...
- 关于void*类型的用法(相当于OC中的id类型)
关于void*类型的用法(相当于OC中的id类型) 1.C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*.float*甚至抽象数据类型的指 ...
- OC 中 self 与 super 总结
一段代码引发的思考: @implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"% ...
随机推荐
- jQuery动态五星评分
效果 css .star ul, .star li { list-style: none; } .star { position: relative; width: 600px; height: 24 ...
- luoguP2265 路边的水沟
题目:http://www.luogu.org/problem/show?pid=2265 题解:ans=C(n+m,n)%p 求一下逆元就行 代码: #include<cstdio> # ...
- (转载)不能启动虚拟机 Unable to open kernel device "\\.\Global\vmx86
(转载)http://blog.csdn.net/shenghuiping2001/article/details/7083153 今天系统加了内存条,设置变了一下: 就启动不起虚拟机了,报错: Un ...
- yarn安装部署
在HDFS HA(http://www.cnblogs.com/yinchengzhe/p/5140117.html)基础上进行yarn的安装. 1.配置yarn-site.xml 参数详情参考 ht ...
- 使用QJM部署HDFS HA集群
一.所需软件 1. JDK版本 下载地址:http://www.oracle.com/technetwork/java/javase/index.html 版本: jdk-7u79-linux-x64 ...
- UVA 11427 Expect the Expected(DP+概率)
链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396 [思路] DP+概率 见白书. [代码] #include&l ...
- vijosP1195“非常男女”计划
vijosP1195“非常男女”计划 链接:https://vijos.org/p/1195 [思路] 人数差. 人数差相等的两点之间的区间一定有男女人数相等. 计目前为止到i的1为sum1,0为su ...
- Java获取当前路径
1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...
- mipi 调试经验
转载自http://blog.csdn.net/g_salamander/article/details/9163455 以下是最近几个月在调试 MIPI DSI / CSI 的一些经验总结,因为协议 ...
- OFFSET & FETCH
OFFSET & FECTH 关键字与ORDER BY结合使用,实现对查询结果的分页 一.单独使用OFFSET: 示例:查询所有职员的信息,按雇佣日期排序并跳过前285条记录(共290条) U ...