OC语言学习 (四) SEL对象,用于日志输出的宏
2014-12-10 14:05
447 查看
SEL 对象即一个selector对象,保存一个方法的地址。
Person.h
#ifndef oc_Person_h
#define oc_Person_h
@interface Person : NSObject
{
int age;
@protected
float height;
}
@property int age; //编译器自动解释成 int age的get/set方法
- (void) say;
- (void) testSEL;
@end
#endif
Person.m
#import <Foundation/Foundation.h>
#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]; //执行 ss指向的方法
[self performSelector:say2]; //-[NSObject performSelector]
/*
以下可以作为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
[[Person
new] testSEL];
输出:
2014-12-10 13:52:36.439 oc[1692:122703] 调用了say方法
2014-12-10 13:52:36.439 oc[1692:122703] 调用了say方法
2014-12-10 13:52:36.439 oc[1692:122703] ------------------------------------------------
2014-12-10 13:52:36.439 oc[1692:122703] 当前方法(NSStringFromSelector):testSEL
2014-12-10 13:52:36.439 oc[1692:122703] 所在文件完整路径(__FILE__):/Users/stone/Documents/workspace_xcode/oc/oc/Person.m
2014-12-10 13:52:36.440 oc[1692:122703] 所在文件名:Person.m
2014-12-10 13:52:36.440 oc[1692:122703] 当前行号(__LINE__):35
2014-12-10 13:52:36.440 oc[1692:122703] 当前方法签名(__func__):-[Person testSEL]
2014-12-10 13:52:36.440 oc[1692:122703] 当前方法签名(__PRETTY_FUNCTION__):-[Person testSEL]
2014-12-10 13:52:36.440 oc[1692:122703] 当前类名(NSStringFromClass):Person
2014-12-10 13:52:36.441 oc[1692:122703] (
0 oc 0x0000000100001556 -[Person testSEL] + 518
1 oc 0x0000000100001fed main + 2077
2 libdyld.dylib 0x00007fff8ad4f5c9 start + 1
)
Person.h
#ifndef oc_Person_h
#define oc_Person_h
@interface Person : NSObject
{
int age;
@protected
float height;
}
@property int age; //编译器自动解释成 int age的get/set方法
- (void) say;
- (void) testSEL;
@end
#endif
Person.m
#import <Foundation/Foundation.h>
#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]; //执行 ss指向的方法
[self performSelector:say2]; //-[NSObject performSelector]
/*
以下可以作为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
[[Person
new] testSEL];
输出:
2014-12-10 13:52:36.439 oc[1692:122703] 调用了say方法
2014-12-10 13:52:36.439 oc[1692:122703] 调用了say方法
2014-12-10 13:52:36.439 oc[1692:122703] ------------------------------------------------
2014-12-10 13:52:36.439 oc[1692:122703] 当前方法(NSStringFromSelector):testSEL
2014-12-10 13:52:36.439 oc[1692:122703] 所在文件完整路径(__FILE__):/Users/stone/Documents/workspace_xcode/oc/oc/Person.m
2014-12-10 13:52:36.440 oc[1692:122703] 所在文件名:Person.m
2014-12-10 13:52:36.440 oc[1692:122703] 当前行号(__LINE__):35
2014-12-10 13:52:36.440 oc[1692:122703] 当前方法签名(__func__):-[Person testSEL]
2014-12-10 13:52:36.440 oc[1692:122703] 当前方法签名(__PRETTY_FUNCTION__):-[Person testSEL]
2014-12-10 13:52:36.440 oc[1692:122703] 当前类名(NSStringFromClass):Person
2014-12-10 13:52:36.441 oc[1692:122703] (
0 oc 0x0000000100001556 -[Person testSEL] + 518
1 oc 0x0000000100001fed main + 2077
2 libdyld.dylib 0x00007fff8ad4f5c9 start + 1
)
相关文章推荐
- 【OC学习-32】KVO-用一个对象监控另一个对象的属性,如有变化,则输出需要的结果
- 我是这样学习Linux下C语言编程的-把程序输出信息加到系统日志里去
- 【OC学习-34】通知NSNotification,类似于KVO,用于对象之间监听然后发通知提醒
- [黑马IOS自学第十篇]OC语言基础,面向对象概念,类学习
- Objective-C学习笔记(四):OC之分类、类对象、description方法和SEL
- OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
- 【OC语言】第四篇·类的继承、多态、类对象以及SEL类型
- 【学习笔记】【OC语言】面向对象思想
- 我是这样学习Linux下C语言编程的-把程序输出信息加到系统日志里去
- 黑马程序员——OC语言学习——关键字id、构造方法、Category-分类、类的本质、 description方法、 SEL方法
- OC语言第一课 面向对象、类、对象、方法一 ——ios学习连载六
- OC语言第二课 面向对象、类、对象、方法二——ios学习连载七
- OC语言学习06-字典对象
- [黑马IOS自学第十一篇]OC语言基础,SELF关键字,面向对象概念,类学习多态,继承@property等
- 【学习笔记】【OC语言】创建对象
- 黑马程序员——OC语言------OC特有语法:分类、description、类对象、SEL
- OC语言学习 (二) 创建OC对象类、成员/静态变量、对象/类方法
- OC语言之学习篇——01——类和对象
- 我是这样学习Linux下C语言编程的-把程序输出信息加到系统日志里去
- 黑马程序员——javascript语言的方法以及部分对象的使用学习日志