一、description方法介绍
1.使用%@打印对象如(“%@”,P)默认打印输出为<类名:内存地址>,
特例:字符串也是对象,但字符串在使用@%打印时情况特殊
2. description的对象方法与类方法
-description
1>会调用对象p的-description方法
2>拿到-description方法的返回值(NSString *) 显示到屏幕上
3>此方法默认返回的是"类名:内存地址" (可通过重写此方法,修改默认值)
+description
1>默认返回的是“类名”
2>使用类调用
3.代码示例
二、重写description方法
1.重写description实现输出Person类成员变量
修改后的Person实现
主函数及输出结果
2.方法区别
+description方法决定了类对象的输出结果,即类本身
-description方法决定了实例对象的输出结果,即Person创建的对象
三、NSLog输出补充
1.官方文档列出的输出语句常用的宏定义表达式
2.代码示例
注意:__双下划线,上图打印结果中没有打印出文件名因为NSLog下__FILE__不支持含中文的路径打印
四、SEL
1.简介
SEL:全称Selector 表示方法的存储位置
SEL是一种对方法的包装。将方法包装成一个SEL类型的数据,然后对象根据数据找到对应方法地址,最后根据地址就可以调用相应方法。
数据 -> 地址 ->方法
2.实例分析
Person *p=[[Person alloc] init]; [p test];
原理图
对象调用方法的具体步骤:
a.把方法包装成SEL类型的数据(每个方法都有个对用的SEL数据)
b.根据SEL数据找到方法在类中的地址
c.根据方法地址调用对应的方法
注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用
3. SEL数据的创建
1>通过@select将方法转化为SEL数据
// 手工将run方法转化为SEL数据s SEL s = @selector(run); // 使用SEL调用run方法 [p performSelector:s];
2>通过函数将字符串转化为SEL数据
// 通过方法名的字符串转化成SEL,然后再调用此方法 NSString *name = @"run"; SEL S1 = NSSelectorFromString(name); [p performSelector:S1];
附:_cmd 代表着当前方法。
// 将当前方法转化为SEL数据 [p performSelector:_cmd];