一、类的本质

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. jboss加密敏感信息

    默认情况下,我们配置在domain.xml或host.xml文件中的信息都是明文,对一些敏感信息就显得安全性不够,可以使用jboss提供的vault机制来进行加密 下面的内容来自 http://www ...

  2. java通过反射获取调用变量以及方法

    一:反射概念 可以通过Class类获取某个类的成员变量以及方法,并且调用之. 二:通过反射获取方法.变量.构造方法 @Test // 通过反射获取类定义的方法 public void testMeth ...

  3. LeetCode 122

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  4. Sqlite官方下载对应版本注意细节

    官网下载地址: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 下载注意事项: 1.对应.net平台 2.对 ...

  5. this指针在不同情况下的指代

     说不同情况了吧,首先要分有几种情况使用this,然后再说分别指代什么 1)如果是一般标签下函数调用,this指代全局对象,也就是window对象或者document对象 2)如果在嵌套函数中被嵌套的 ...

  6. Ehcache(2.9.x) - API Developer Guide, Blocking and Self Populating Caches

    About Blocking and Self-Populating Caches The net.sf.ehcache.constructs package contains some applie ...

  7. ASP常用函数表

    ASP常用函数表(新手们的好工具) 作者:未知 Array() 函数返回一个数组 表达式 Array(list) 允许数据类型: 字符,数字均可 实例: <% Dim myArray() For ...

  8. HDOJ2015偶数求和

    偶数求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. redis学习-day1

    1.nosql数据库的一种. 2.Redis 是一种开源的,先进的key-value存储.它通常被称为数据结构服务器.因为键可以包含字符串.哈希.链表.集合和有序集合. 特点: 3.为了保证效率,数据 ...

  10. js,css 和 html 分离,见仁见智

    信经常观察大站的朋友都会发现,他们都把CSS写在HMTL页面里,一个页面的或者多个页面的背景图片,都集成到一张图片里,他们有的JS文件,也写到页面里了……也许你会迷惑,现在到处讲页面的优化,不都是要把 ...