OC基础—description方法、SEL类型

来源:互联网 发布:买手机哪几个淘宝网好 编辑:程序博客网 时间:2024/05/21 06:25

------ android培训java培训、期待与您交流! ----------


                                             OC基础—description方法

   description方法是我们OC自带的方法,description方法分两种(-description,+description)

我们有一个要求,NSLog(@"%@", p);p是一个Person 对象,这时NSLog会输出<类名:内存地址>,现在我们需要使用NSLog(@"%@", p);输出的是p这个对象时输出的是对象的具体属性。

NSLog是怎样工作的呢?

1.当我们使用NSLog这个函数时,会调用对象的一个方法-description方法。

2. 拿到-description方法的返回值(NSString  *)显示到屏幕上。

3. -description方法默认返回的是<类名:内存地址>

那么我们重写一下-description方法

#import "Person.h"@implementation Person- (NSString *)description{     return [NSString stringWithFormat:@"age = %d, name = %@", _age, _name];}@end

而如果我们要输出一个类对象:
Class c = [Person class];
NSLog(@"%@", c);

1. 先会调用类的+description方法
2. 拿到+description方法的返回值显示到屏幕上

#import "Person.h"@implementation Person+ (NSString *)description{     return [NSString stringWithFormat:@"age = %d, name = %@", _age, _name];}@end

下面补充一点NSLog相关的东西

void test(){    //日志增强    NSLog(@"%d", __LINE__); // 行号    // NSlog 输出c语言字符串的时候,不能有中文    // NSLog(@"%s", __FILE__); // 路径    printf("%s", __FILE__);      NSLog(@"%s", __func__); // 输出当前函数名        Person *p = [[Person alloc] init];    p.age = 20;    p.name = @"liye";    // 指针变量的地址    NSLog(@"%p", &p);    // 类名:对象地址    NSLog(@"%@", p);    // 对象地址    NSLog(@"%p", p);}
                 SEL类型
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法。
对象的方法我们早就知道是存放到类当中的。
类中的每个方法都有一个与之对应的SEL类型的数据,当我们调用方法时,他会根据对象中的isa指针,将方法包装成SEL类型的数据区类中找。看看这个SEL对应的是哪个方法,然后调用。其实SEL存储的时方法的地址,根据SEL地址找到方法地址,找到对应的地址。
这种方式使用缓存的,第一次使用之后,以后调用就可以直接调用

#import <Foundation/Foundation.h>#import "Person.h"int main( ){    Person *p = [[Person alloc] init];    // 这句话一执行就会分配空间给类,类里的每一个方法都有一个Sel类型的数据相对应    [p test2];    // 1.给person对象分配空间,isa指向类 把test2包装成sel类型的数据,去类里面找 2.根据SEL数据找到相对应数据地址 3、根据方法的地址调用对应的方法        // 第二种方式调用方法    [p performSelector:@selector(test2)];        [p test3:@"asdfsa"];    // 第三种方式调用方法    [p performSelector:@selector(test3:) withObject:@"asdfsa"];    // 也可以这样,我们知道一个方法的字符处啊形式    NSString *name = @"test3";    SEL s = NSSelectorFromString(name);    [p performSelector:s withObject:@"123"];    return 0;}

SEL对象的创建:
SEL s = @selector(test);
SEL s2 = NSSelectorFromString(@"test");
将SEL对象转为NSString对象
NSString *str = NSStringFromSelector(@selector(test));

每个方法里面都有一个SEL类型的数据_cmd,_cmd代表着当前对象。


------ android培训java培训、期待与您交流! ----------

0 0
原创粉丝点击