您的位置:首页 > 移动开发 > Objective-C

Objective-C学习笔记(四):OC之分类、类对象、description方法和SEL

2016-03-01 21:09 405 查看
一、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



运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: