一、类的本质

1、类也是个对象

  • 其实类也是一个对象,是Class类型的对象,简称“类对象”
  • Class类型的定义

  typedef struct objc_class *Class;

  • 类名就代表着类对象,每个类只有一个类对象

2、+load和+initialize

  • +load

  在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法

  先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load

  先加载元原始类,再加载分类

  不管程序运行过程有没有用到这个类,都会调用+load加载

  • +initialize

  在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法

  一个类只会调用一次+initialize方法,先调用父类的,再调用子类的

3、获取类对象的2种方式

  Class c = [Person class]; // 类方法

  或者

  Person *p = [Person new];

  Class c2 = [p class]; // 对象方法

4、类对象调用类方法

  Class c = [Person class];

  Person *p2 = [c new];

二、description方法

1、-description方法

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

2、+ description方法

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

3、description方法

  description方法是用于输出方法中输出%@时(输出对象),底层调用的,默认情况下输出的是对象的内存地址,若要输出对象就需要对description方法进行重写;当输出时想把字符串进行拼接可以在description方法中调用stringWithFormat方法。

4、修改NSLog的默认输出

  重写-description或者+description方法即可

5、死循环陷阱

  如果在-description方法中使用NSLog打印self

三、SEL

1、方法的存储位置

  • 每个类的方法列表都存储在类对象中
  • 每个方法都有一个与之对应的SEL类型的对象
  • 根据一个SEL对象就可以找到方法的地址,进而调用方法
  • SEL类型的定义

  typedef struct objc_selector    *SEL;

2、SEL对象的创建

  SEL s = @selector(test);

  SEL s2 = NSSelectorFromString(@"test");

3、SEL对象的其他用法

  // 将SEL对象转为NSString对象

  NSString *str = NSStringFromSelector(@selector(test));

  Person *p = [Person new];

  // 调用对象p的test方法

  [p performSelector:@selector(test)];

四、NSLog输出增强

  • __FILE__ :源代码文件名
  • __LINE__ :NSLog代码在第几行
  • _cmd :代表着当前方法的SEL

  // 下面的代码会引发死循环

  - (void)test {

    [self performSelector:_cmd];

  }

类的本质、description方法、SEL、NSLog输出增强的更多相关文章

  1. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  2. Objective-C description方法 SEL类型

    description方法 #import "Person.h" @implementation Person - (void) setAge : (int) age { _age ...

  3. C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  4. CO-类的本质、description方法

    类的本质 1. 类也是个对象 其实类也是一个对象,是Class类型的对象,简称“类对象” Class类型的定义 typedef struct objc_class  *Class; 类名就代表着类对象 ...

  5. 自定义构造、description方法、SEL

    [Objective-C]07-自定义构造方法和description方法   // 构造方法:用来初始化对象的方法,是个对象方法,”-"开头// 重写构造方法的目的:为了让对象创建出来,成 ...

  6. OC description和sel

    一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象方法) 使用NSLog和@%输出某个对象时, ...

  7. - description 方法作用

    自定义一个Person类 @interface Person : NSObject { int _age; double _height; double _weight; NSString *_nam ...

  8. 什么情况下才要重写Objective-C中的description方法

    特别注意: 千万不要在description方法中同时使用%@和self,同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用descrip ...

  9. 李洪强iOS开发之【Objective-C】07-自定义构造方法和description方法

    知识回顾 在前面已经介绍了如何定义类和创建并初始化对象,比如有Student这个类 1.Student.h 1 #import <Foundation/Foundation.h> 2 3 ...

随机推荐

  1. [改善Java代码]避免带有变长参数的方法重载

    建议4: 避免带有变长参数的方法重载 在项目和系统的开发中,为了提高方法的灵活度和可复用性,我们经常要传递不确定数量的参数到方法中,在Java 5之前常用的设计技巧就是把形参定义成Collection ...

  2. javascript深入理解闭包

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  3. Redis 命令 - Connection

    AUTH password Authenticate to the server More: http://redis.io/commands/auth, http://www.redis.cn/co ...

  4. IIS部署网站局域网内无法访问

    今天在局域网发布一个网站时遇到了个问题,在本机上可以访问,但局域网内其他机子访问此IP地址时无法显示,这个问题以前也遇到过,现在总结一下处理方法 检查两个方面: IIS网站身份验证 在IIS中选择要发 ...

  5. ubuntu(16.04.01)学习-day1

    1.修改root用户密码 sudo passwd root 按提示进行设置. 2.从Ubuntu 16.04开始,用户可以实现改变启动器的位置,可以将启动器移到屏幕底部,但是无法移到右边或顶部.打开终 ...

  6. JDBC之数据库操作

    JDBC重要界面有: java.sgl.DriverManager:完成驱动程序的装载和建立新的数据库连接. java.sgl.Connection:表示对某一指定数据库的连接. java.sgl.S ...

  7. BLK-MD-BC04-B蓝牙模块的资料

    BLK-MD-BC04-B蓝牙模块的资料   蓝牙模块说明 蓝牙模块 波特率 波特率从1200到1382400,具体可以参考波特率列表.     电平接口 答:模块的接口是SPP电平,电压为3.3V. ...

  8. Cocos开发中Visual Studio下libcurl库开发环境设置

    我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...

  9. 捕获异常 winform

    可以捕获winform中的异常写到文本中 <p>可以捕获winform中的异常写到文本中</p> <div class="cnblogs_code" ...

  10. (转)深入探讨在集群环境中使用 EhCache 缓存系统

    简介: EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider.本文充分的介绍了 EhCache 缓存系统对集群环境的 ...