美文网首页
分类(category)和类扩展(extension) 详解

分类(category)和类扩展(extension) 详解

作者: 管乐_VICTOR | 来源:发表于2018-04-13 19:13 被阅读10次

    什么时候使用分类(category)呢?
    比如:

    eg.1,我们已经写了很多的页面了,然后要所有类都要添加一个方法,用来收集一些信息,并且这些页面都继承自UIViewController中,我们就可以把代码添加到UIViewController就可以了。
    eg.2,我们想要在原来类里边重写方法,或者添加自定义方法的时候,可以使用category来实现。
    

    分类(category)中只能添加方法,不能添加成员变量;
    分类(category)只能访问原来类的@protect和@public成员变量,不能访问私有成员变量,如果非要访问的话,不能直接访问,但是可以写方法来访问;
    分类(category)其实里边是可以添加成员变量的,category添加成员变量传送门

    分类的添加过程如下:


    1-1.png 1-2.png

    然后生成的类JWTest1ViewController+unlock.h我们可以看到,.h文件如下

    #import "JWTest1ViewController.h"
    
    @interface JWTest1ViewController (unlock) // JWTest1ViewController 是原来的类 , unlock是分类
    
    - (void)userUnlock; // 这个是我们添加的方法
    
    @end
    

    .m文件如下

    #import "JWTest1ViewController+unlock.h"
    
    @implementation JWTest1ViewController (unlock)
    
    - (void)userUnlock{
        NSLog(@"userUnlock");
    }
    
    @end
    

    如何不用每个类里边都要添加头文件才能引用?还有分类的优先级是怎么样的呢?

    下面我们来看一下类扩展(extension)
    其实类扩展我们经常见到,项目中也经常用到;先来看一下JWTest1ViewController的.m中的代码

    #import "JWTest1ViewController.h"
    
    @interface JWTest1ViewController () // 这里就是类扩展(extension)
    
    @end
    
    @implementation JWTest1ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    类扩展是category的一个特例,也叫匿名分类,为该类添加一些属性和方法。

    并且写在.m中的变量和方法都是私有的,写在.h中的变量和方法就是公共的。

    相关文章

      网友评论

          本文标题:分类(category)和类扩展(extension) 详解

          本文链接:https://www.haomeiwen.com/subject/kioqkftx.html