• ios category 和 extension 的区别以及如何为 category 添加属性


    如果你面试过几次, 尤其是有笔试题的那种公司, 这个问题的出现几率很高, 其实出笔试题也不容易, 太难了他们自己也不会, 太容易又显示不出水平, 就这种既能考点基本功 又能无意中看你是否了解 runtime.

    首先我觉得其实 category 和 extension 都可以归为一类, 分类, extension 可以看做匿名分类

    1 >>> category 分类

    什么是分类呢? 就是在不用继承,不改变原来类的情况下, 为一个类添加新的方法, 扩展类的功能, 比如你可以给 NSString 类添加一个自动大小写转换的方法, 以后你只要直接用 NSString 对象直接调用该方法就好了

    (1)创建分类 new file -> objc-file -> 选择类型 category ,选择 class -> create

    (2)使用 分类的样子 NSString + stringCate.h 形如这种 , 可以在. h中声明方法 ,.m 实现该方法即可, 其他跟调用方法一样

    (3)如何添加属性, 大家都知道 category 和 extension 的区别是 category 不能添加属性,而 extension 可以, extension 中的属性和方法会被当做私有的, 但是我们可以利用runtime 这种神器为 category 添加属性,其中会用到一个关联属性的 API 

    static NSString *strKey = @"strKey";

    objc_setAssociatedObject(self, &strKey, cateStr, OBJC_ASSOCIATION_COPY);

    objc_getAssociatedObject(self, &strKey);

    #import "NSString+stringCate.h"

    static NSString *strKey = @"strKey";

    @implementation NSString (stringCate)

    // setter

    -(void)setCateStr:(NSString *)cateStr{

      objc_setAssociatedObject(self, &strKey, cateStr, OBJC_ASSOCIATION_COPY);

    }

    // getter

    -(NSString *)cateStr{

      return objc_getAssociatedObject(self, &strKey);

    }

    -(void)printString{

      NSLog(@"this is a category method");

    }

    @end

    代码已经很清晰了, 声明属性 , 重写 setter getter 方法,在 setter 里设置关联属性 , 在 getter 里获取关联属性

    2>>> extension

    extension 就不用说了吧 其实上面已经讲到了 extension是一个声明私有方法和私有的变量的好地方

    与 category 不同的是 extension 中声明的方法一定要实现 , category 则没有这种限制

    category的优先级最高 会覆盖掉原来类中的方法

  • 相关阅读:
    动态规划最后一击
    leetcode N-Queens I && N-Queens II
    leetcode Spiral Matrix
    leetcode Submission Details
    由网易云音乐到算法体会
    leetcode Rotate Image
    线性表之双链表
    线性表之循环单链表
    线性表之单链表
    [HDU] 1561 The more, The Better 树形DP加01分组背包
  • 原文地址:https://www.cnblogs.com/ChrisZhou666/p/8515256.html
Copyright © 2020-2023  润新知