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(@"% ...
随机推荐
- SQLite: sqlite_master
SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引.每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据库的 ...
- Oracle RAC的五大优势及其劣势
Oracle RAC的五大优势及其劣势 不同的集群产品都有自己的特点,RAC的特点包括如下几点: 双机并行.RAC是一种并行模式,并不是传统的主备模式.也就是说,RAC集群的所有成员都可以同时接收客户 ...
- Maven学习(1) - Maven入门
home index:http://maven.apache.org/ download:http://maven.apache.org/download.cgi install: http://ma ...
- Unity3D屠龙战机项目总结
之前跟着老师后面边学边做了一个屠龙战机项目,在这个项目中,主要用到的技术,在这里总结一下(本次项目的脚本语言用的是JS): 1. 如果想在场景中导入一个声音文件,则需要在脚本中添加一个变量,如在脚本 ...
- shadowgun的飘扬旗帜shader
MADFINGER-Lightmap-Unlit-Wind用于模拟布料和树被风吹的弯曲摆动效果 这个来自于<GPU GEMS 3>中的 “Chapter 16 Vegetation Pro ...
- ORACLE EXP-00011:表不存在的分析和解决方案
解决方法: ~~看下数据库的延迟段创建参数 SQL> show parameter DEFERRED_SEGMENT_CREATION NAME ...
- C#中同时使用Lambda表达式和递归
Func<object, int> RTFunc = (RTFuncRT) => { return (RTFuncRT as Func<object, int>)(RTF ...
- 南京Uber优步司机奖励政策(1月25日~1月31日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- winform 跨窗体给控件传值 分类: WinForm 2014-08-02 16:33 195人阅读 评论(0) 收藏
两个窗体 FormA,FormB; FormA窗体中有一文本框控件:TextBox; FormB窗体中有一变量:txtJSJ 目的:把变量赋值给文本框 实现: 设置TextBox属性: Modifie ...
- Color Cube – 国产的优秀配色取色工具
官方下载地址:http://fancynode.dbankcloud.com/ColorCube2.0.1ForWin.rar 比如今天所要介绍的 Color Cube (配色神器) 就属于“功大于过 ...