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的优先级最高 会覆盖掉原来类中的方法

  • 相关阅读:
    Nvidia TX2 Robot 环境配置记录
    [DL学习笔记]从人工神经网络到卷积神经网络_2_卷积神经网络
    [DL学习笔记]从人工神经网络到卷积神经网络_1_神经网络和BP算法
    windows重建图标缓存(解决快捷方式图标丢失,图标加载时间长问题)
    tensorflow安装日志(PIP)
    java中字符串的排序(1)
    可行性分析报告
    冒泡,选择,插入,快速排序在Java中的实现
    四则运算法则在Java中的实现
    关于二次方程计算器的程序开发
  • 原文地址:https://www.cnblogs.com/ChrisZhou666/p/8515256.html
Copyright © 2011-2022 走看看