zoukankan      html  css  js  c++  java
  • IOS开发-ObjC-Category的使用

    在IOS移动App开发中,经常会出现以下情况:定义好了一个类,但后来需求升级或改变之后需要对这个类增加功能,这样的话往往需要修改类的结构,这样就会导致不能预期的问题产生,所以Obj-C提供了一种叫做Category的方法来对类进行扩展,在不改变原有类结构的基础上增加新的功能。具体的使用方法如下文。     

    假设我们现在有一个类叫做Person类,继承自NSobject,Person类目前有一个功能就是改变Person实体对象的年龄函数,叫做changeAge,具体的声明和实现如下:          

    1.类Person的声明: 

    //  Person.h
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    -(void)changeAge;
    @end

                 

    2.类Person的实现   

    //  Person.m
    #import "Person.h"
    
    @implementation Person
    -(void)changeAge
    {
        Nslog(@"Person类的年龄改变了");
    }
    @end

      

    一开始我们的规划中,Person类中只需要一个功能也就是changeAge,后来考虑到Person年龄会随着时间而改变(需求变化)导致我们需要增加一个功能,当年份增加的时候,Age也要对应加1,这样我们就需要增加一个ageAutoChange的方法,按照文章开头的说法,使用category可以在不改变原有类的基础上增加类的方法,具体做法如下:

    1)点击新建文件,在弹出的对话框中选择Objective-C File,然后下一步,在弹出的对话框中会有三个输入框,第一个是File:这个后面填你要增加的方法的文件名,我这里填入autoage,第二个是File Type:这个里面下拉选择Category,然后第三个Class,也就是要扩展的类名,我这里下拉选择Person,然后点击Next保存,就完成了扩展类的新建;

    2)完成第一步之后会多出两个文件,分别是Person+Person_Autoage.h和Person+Person_Autoage.m,然后在Person+Person_Autoage.h中编辑如下:

    //  Person+Person_autoAge.h
    
    #import "Person.h"
    
    @interface Person (Person_autoAge)
    -(void)autoChangeAge;
    @end

    在Person+Person_Autoage.m中编辑如下:

    //  Person+Person_autoAge.m
    
    #import "Person+Person_autoAge.h"
    
    @implementation Person (Person_autoAge)
    -(void)autoChangeAge
    {
        NSLog(@"Person的年龄增加1岁了");
    }
    @end

    这样就完成了新功能的增加(在不该变原来类的定义的基础上)

    接下来我们要在主函数里调用这两个方法,以验证我们的理解是否有偏差:

    //  main.m
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Person+Person_autoAge.h"
    
    int main(int argc, const char * argv[]) {
        {
            Person * p1=[[Person alloc] init];
            [p1 changeAge];
            [p1 autoChangeAge];
        }
        return 0;
    }

    完成之后点击运行,命令行中出现如下:

    2016-02-20 15:48:23.310 studyCategory[652:8132] Person类的年龄改变了
    2016-02-20 15:48:23.330 studyCategory[652:8132] Person的年龄增加1岁了
    Program ended with exit code: 0

    这就说明我们的过程是没有问题的,Person的对象p1不但可以正常调用changeAge这个方法,也可以定义我们后来增加的autoChangeAge的功能。

    通过Category这个功能把类的方法切分在了不同的文件中,具体有什么好处,我在以后的学习过程中体验到了会补充出来的,毕竟现在只是学习过程,先把功能学会。

        

  • 相关阅读:
    yum 本地 网络 openstack
    docker 负载均衡
    tomcat + nginx 负载均衡 动静分离 session会话配置
    K8S Ingress 之 traefik-ingress-controller
    CentOS7安装和配置rsync+inotify
    DAS,NAS,SAN在数据库存储上的应用
    inotify+rsync实现实时同步
    NFS网络文件系统
    CentOS7下rsync服务的基本详解和使用
    LVM--逻辑卷管理
  • 原文地址:https://www.cnblogs.com/jiwangbujiu/p/5203454.html
Copyright © 2011-2022 走看看