zoukankan      html  css  js  c++  java
  • 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的优先级最高 会覆盖掉原来类中的方法

  • 相关阅读:
    点击单元格(LinkToAction)获取Table行号和数据(Table篇一)
    金额和数量不显示0
    自定event事件之全局初始化中自动触发(二)
    自定event事件之手动触发(一)
    Python的requests如何同时post图片二进制流和json数据application/octet-stream
    树莓派点亮LED灯需要几行代码?3行。小孩子都能学会
    50元求解pyqt加载并显示pdf问题
    pyqt5加载pdf文档失败
    建个群,互相关心
    唉,十年前的沙雕照片
  • 原文地址:https://www.cnblogs.com/ChrisZhou666/p/8515256.html
Copyright © 2011-2022 走看看