• Extension 代表的是私有成员变量


    不明白就问百度、百度搜索得到的结果总是那么多却总是那么千篇一律。不晓得是什么原因。

    刚完成一个项目、需要整理一下知识点。

    在新项目开始的时候就比较矛盾、因为以前的项目中都有BaseViewController 用了几个项目之后觉得这个解决方案不是很好。索性就把Categroy用上、目的就是希望扩展UIViewController 远离继承。(如果继承能很好的解决问题的时候再使用)、当时考虑使用Category的原则是将每个控制器都回用到的方法和属性放进去。还有就是使用频率高、有不希望设置成全局变量的也封装进去。例如:身份验证、操作提示动画、和状态。

    当然对于身份、权限控制使用到了 单例模式和归档、解档。感觉使用起来挺方便的、比起之前的继承不用考虑应该继承那个特定的父类。

    同时为了属性封装使用到了运行时的特性。(项目完成后又恶补了下runtime)

    只是有点一直在困扰着我、就是Extension 一直困扰着我、看看那么多的文章介绍可还是有些不明白。今天没事专门了解一下。

    当我明白的时候我就很操蛋为毛那么多人介绍Extension 就没有一个人愿意把问题说清楚了。

    Extension

    ex:头文件.h

    @interface FirstViewController : UIViewController

    // 这个控制器大家很熟悉吧。
    @end

         实现文件.m

    @interface FirstViewController () //这里就是extension

    //之前一直以为你Extension 是一个独立的文件。后来我试过创建一个extension 文件 NSObject_ObjExtend.h  总是提示not found 很郁闷。即使可以import 也依然不能使用里面定义的方法和属性 后来没有继续纠结。

    // 大家不要奇怪 为什么说这就是Extension

    1、 可以定义属性

    2、可以定义方法

    3、属性的实现使用 @synthesize

    4、这里定义的方法和属性都是私有的。

    可以看这里
    @end
    @implementation FirstViewController

    @end

    更加强大的Category

    对于category我个人感觉他应该比Extension 更强大。

    它是一个真正意义上的扩展。

    Category 的扩展是Public 不像Extension 扩展的是Private

    对于Category 的扩展 高级的扩展会用的runtime

    ex:头文件.h

    @interface UIViewController (RenRen)<MBProgressHUDDelegate>

    @property(nonatomic,strong) MBProgressHUD* HUD;

    @end

    实现文件.m

    static char const * const rrHUD =  "HUD";// 定义一个key
    @implementation UIViewController (RenRen)
    @dynamic HUD; //标示为动态属性

    -(MBProgressHUD *)HUD{ // getter
        return objc_getAssociatedObject(self, rrHUD);
    }

    -(void)setHUD:(MBProgressHUD *)HUD{ //setter
        objc_setAssociatedObject(self, rrHUD, HUD, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    @end

    上面的代码可以看到Category 扩展属性 的方式 用到的是runtime。

    总结:

         Category 比起 Extension 更具有灵活性。前者的扩展是Public 后者是Private。 通过Category 能够解决更加复杂的问题。

  • 相关阅读:
    用于Delphi的DevExpress VCL组件——富文本编辑功能升级
    5个技巧,教你优化React App性能
    DevExpress WPF模板库助力快速完成界面美化
    Web开发小技巧放送
    WinForm应用界面开发入门指南
    浅析C#中单点登录的原理和使用
    Wireshark抓包,带你快速入门
    你必须知道的EF知识和经验
    你知道SqlDataAdapter中的Fill是怎么实现的吗
    一文说通C#中的异步编程
  • 原文地址:https://www.cnblogs.com/softwaretailor/p/5006898.html
Copyright © 2020-2023  润新知