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

来源:互联网 发布:linux twm 编辑:程序博客网 时间:2024/05/14 10:15

一、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

      

       运行结果

      

1 0