一、Category 分类
1.分类的创建
1>首先按照学习笔记(一)中的方法创建一个新的命令行项目
2>new file新建一个文件
3>选取OS X下Source中的Objective-C file
4>File Type选择Category,Class自己选择,并取名
5>创建成功
2.分类的形式为
@interface 类名 (分类名称)
@end
@implementation 类名 (分类名称)
@end
分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法。
分类使用注意:1>分类只能增加方法,不能增加成员变量
2>分类方法实现中可访问原来类中声明的成员变量
3>分类可以重新实现原来类中的方法,但会覆盖原来的方法,导致原来方法没法再用,故不推荐
4>方法调用的优先级:分类(最后参与编译的分类优先)>原来的类 >父类
二、类对象
类本身也是一个对象,是class类型的对象,简称类对象;我们利用类对象去创建类的对象。
获取类对象
Person *p=[Person alloc]init]; ---------------> Class c=[p Class];
Class c1=[Person Class]; ----> c,c1相同
三、description方法
1.默认情况下,利用NSLog和%@输出对象时,会调用description方法,并拿到返回值进行输出。
description方法有两种:+description(类方法)和-description(对象方法),+方法决定了类对象的输出结果,-方法决定了实例对象的输出结果。
2.我们来看一个例子,当你分别使用自定义的类创建对象和利用系统自带的类创建对象,然后利用NSLog和%@输出对象时,是不是会直接打印出对象中的所有内容
Person.h (Person.m我没有写东西)
main.m
运行结果
可以看到用自定义类的对象来输出时,输出的是一串没什么用的东西,其实他是descrption方法的默认输出形式:<类名:内存地址>。但是个东西的输出对我们来说并没有什么卵用,所有就要用到重写description方法来解决问题,让输出的结果更符合我们的要求。
现在在Person.m文件中重写了description方法:
Person.m
main.m
运行结果
另外要注意一点,这种写法是错误的,会造成死循环。因为你会不停地进入description方法。
四、SEL
对方法的调用除了直接调用,还有一种方式:利用SEL-------SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
示例:
Person.m(看AddAge方法)
main.m
运行结果