一、description方法
1、 -description方法
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出
2、 +description方法
使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出
3、 修改NSLog的默认输出
重写-description或者+description方法
例如:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@property NSString *name;
@end
@implementation Person
- (NSString *)description
{
//方法的返回值会显示到屏幕上
return [NSString stringWithFormat:@"age=%d,name=%@",_age,_name];
}
+ (NSString *)description
{
return @"wj";
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
Person *p = [[Person alloc] init];
p.age = 10;
p.name = @"cx";
//如果没有重写description方法,打印的将会是类的地址
//调用的是对象description
NSLog(@"%@",p);
//调用类的description
NSLog(@"%@",[Person description]);
Class c = [Person class];
NSLog(@"%@",c);
return 0;
}
如果在-description方法中使用NSLog打印self则会陷入死循环,因为self会调用到本身。
例如:
- (void)description
{
NSLog(@"%@",self);
}
二、SEL
1、什么是SEL
每个类的方法列表都存储在类对象中,SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法在内存中的地址,找到地址就可以调用该方法了
2、SEL类型的定义
SEL在程序库中的定义如下:
typedef struct objc_selector *SEL;
所以定义SEL的变量时也不需要跟上“*”
3、SEL对象的创建
SEL s = @selector(test);//直接将已知的方法转为SEL对象
SEL s2 = NSSelectorFromString(@"test");//根据方法名转为SEL对象
4、SEL对象的其他用法
// 将SEL对象转为NSString对象
NSString *str = NSStringFromSelector(@selector(test));
Person *p = [Person new];
// 调用对象p的test方法
[p performSelector:@selector(test)];
代码示例:
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)test;
- (void)test1:(NSString *)name;
- (void)test3;
@end
@implementation Person
- (void)test
{
//每一个方法中都有一个sel类型的变量_cmd,该变量记录的是该方法的名字
//SEL s = _cmd;
//将SEL类型转为字符串类型
NSString *s = NSStringFromSelector(_cmd);
//NSString *s = [NSString ]
NSLog(@"调用了test方法——————%@",s);
}
- (void)test1:(NSString *)name
{
NSLog(@"调用的是test1方法————%@",name);
}
- (void)test3
{
NSLog(@"test3");
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main()
{
Person *p = [[Person alloc] init];
/**通过方法名字符串调用该方法,不带参数*/
NSString *name = @"test";
// 将该字符串转为SEL类型
SEL s = NSSelectorFromString(name);
//通过SEL类型数据调用该方法
[p performSelector:s];
//间接调用test3
[p performSelector:@selector(test3)];
/**通过方法名字符串调用该方法,带参数*/
//:也是方法名的一部份
NSString *name1 = @"test1:";
//将该字符串转为SEL类型
SEL s1 = NSSelectorFromString(name1);
//通过SEL类型数据调用该方法
[p performSelector:s1 withObject:@"wj"];
return 0;
}
三、NSLog输出增强
__FILE__ :源代码文件名
__LINE__ :NSLog代码在第几行
_cmd :代表着当前方法的SEL
会引发死循环的代码:- (void)test {
[self performSelector:_cmd];
}