一、description方法

Description方法包括类方法和对象方法。(NSObject类所包含)

(一)基本知识

-description(对象方法)

使用NSLog和@%输出某个对象时,会调用对象的description方法,并拿到返回值进行输出。

+description(类方法)

使用NSLog和@%输出某个对象时,会调用类对象的description方法,并拿到返回值进行输出,把整个对象一次性打印出来,打印对象使用%@。

使用@%打印对象如(“@%”,P)默认打印输出为<类名:内存地址>,虽然字符串也是对象,但字符串在使用@%打印时情况特殊。

那么应该怎么实现打印对象的所有属性呢?在类的实现中重写description方法。

(二)实现打印对象的所有属性

(三)区别

+description方法决定了类对象的输出结果,即类本身

-description方法决定了实例对象的输出结果,即Person创建的对象。

(四)打印相关补充

二、SEL

SEL:全称Selector 表示方法的存储位置。

方法在内存中是怎么存储的?

Person *p=[[Person alloc] init];

[p test];

寻找方法的过程:

(1)首先把test这个方法名包装成sel类型的数据;

(2)根据SEL数据找到对应的方法地址;

(3)根据方法地址调用相应的方法。

(4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

关于_cmd:每个方法的内部都有一个-cmd,代表着当前方法。

注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

 #import <Foundation/Foundation.h>

 @interface Person : NSObject

 + (void)test;

 - (void)test2;

 - (void)test3:(NSString *)abc;

 @end

 #import "Person.h"

 @implementation Person
+ (void)test
{
NSLog(@"test-----");
} - (void)test2
{
// _cmd代表着当前方法 NSString *str = NSStringFromSelector(_cmd); // 会引发死循环
// [self performSelector:_cmd]; NSLog(@"调用了test2方法-----%@", str);
} - (void)test3:(NSString *)abc
{
NSLog(@"test3-----%@", abc);
}
@end /*
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法 其实消息就是SEL
*/ #import <Foundation/Foundation.h>
#import "Person.h" int main()
{
Person *p = [[Person alloc] init]; [p test2]; // NSString *name = @"test2";
//
// SEL s = NSSelectorFromString(name);
//
// [p performSelector:s]; // 间接调用test2方法
//[p performSelector:@selector(test2)]; //[p test3:@"123"]; // SEL s = @selector(test3:);
//
// [p performSelector:s withObject:@"456"]; //[p test2]; // 1.把test2包装成SEL类型的数据
// 2.根据SEL数据找到对应的方法地址
// 3.根据方法地址调用对应的方法
return ;
}

最新文章

  1. html学习第三天—— 第13,14章
  2. 安装yii2时出错 Invalid Parameter – yii\base\InvalidParamException
  3. java中的IO操作
  4. 使用canvas检测HTML5视频解码错误
  5. vs xamarin android 监听返回键退出程序
  6. CEF3开发者系列之外篇——IE中JS与C++交互
  7. debug note-- nginx php-fpm : Error:The page you are looking for is temporarily unavailable.
  8. yield学习续:yield return迭代块在Unity3D中的应用——协程
  9. NuGet v3 feed带来的惊喜
  10. andriod 获得drawable下所有图片
  11. Experience all that SharePoint 15 has to offer. Start now or Remind me later.
  12. Android XListView实现原理讲解及分析
  13. 【IE6的疯狂之十三】IE6下使用滤镜后链接不能点击的BUG
  14. JSON与String之间互转
  15. XML的解析(DOM以及SAX方式)
  16. 关于getch()函数
  17. vue实现双向数据绑定的原理
  18. 关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件
  19. git报错处理
  20. 使用FFmpeg常见问题

热门文章

  1. Python Web学习笔记之TCP、UDP、ICMP、IGMP的解释和区别
  2. oracle、Mysql数据库客户端DbVisualizer安装
  3. JavaScript闭包 懂不懂由你反正我是懂了
  4. windows服务与自启动程序的区别(转载)
  5. luogu4473 BZOJ2143 2011[国家集训队]飞飞侠
  6. yum第三方安装-软件包没签名及更新错误
  7. IDEA快捷键复习使用
  8. Darknet卷基层浅层特征可视化教程
  9. hdoj-2086-A1=?
  10. UVa 10881 蚂蚁