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

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

在新项目开始的时候就比较矛盾、因为以前的项目中都有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 能够解决更加复杂的问题。

Extension 代表的是私有成员变量的更多相关文章

  1. [C++参考]私有成员变量的理解

    私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了 ...

  2. c++中嵌套类,外部类访问内部类的私有成员变量

    在嵌套类中,内部类可以直接访问外部类的私有成员变量,但是外部类不能直接访问内部类的私有成员变量,必须把外部类声明为内部类的友元类 /********************************** ...

  3. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  4. Java子类访问父类的私有成员变量

    /**子类会继承父类所有的属性和方法. * 但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量 * 所以对于重名变量,子类和父类都各有一份. * 对于子类和父类中 ...

  5. java 反射获取设置私有成员变量的值

    for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicat ...

  6. private成员变量真的私有吗?(用指针刨他祖坟)

    今天写程序时突然想到的,为什么不用指针去获取类的成员变量呢.于是做了这个实验.首先定义了一个类: class Test { private: int i; char c; int* p; public ...

  7. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  8. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  9. OC-category 为什么不能添加成员变量

    以下的答案是百度的,仅做记录而已: 1. 利用运行时实际上也不是添加成员变量.已编译的类的内存布局是不变的,Class就是一个结构体,里面的成员不能改变.但是通过运行时可以将一个对象或基础类型变成指定 ...

随机推荐

  1. Hadoop系列之(一):Hadoop单机部署

    1. Hadoop介绍 Hadoop是一个能够对海量数据进行分布式处理的系统架构. Hadoop框架的核心是:HDFS和MapReduce. HDFS分布式文件系统为海量的数据提供了存储, MapRe ...

  2. MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片

    1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...

  3. 使用Spring Security Oauth2完成RESTful服务password认证的过程

            摘要:Spring Security与Oauth2整合步骤中详细描述了使用过程,但它对于入门者有些重量级,比如将用户信息.ClientDetails.token存入数据库而非内存.配置 ...

  4. 在MVC3中使用code first生成数据局库并操作数据库

    1.建立Users和UserInfos两个实体类 对应的是数据库中的表 public class User { //类名+Id(User+Id)组成的字符串在数据库表中会设置该字段是主键且是按1的增量 ...

  5. 初识zookeeper(一)之zookeeper的安装及配置

    1.简要介绍 zookeeper是一个分布式的应用程序协调服务,是Hadoop和Hbase的重要组件,是一个树型的目录服务,支持变更推送.除此还可以用作dubbo服务的注册中心. 2.安装 2.1 下 ...

  6. 10个值得深思的PHP面试问题

    本文所罗列的问题虽然看似简单,但是每个背后都涵盖了一个或几个大家容易忽视的基础知识点,希望能够帮助到你的面试和平时工作. Q1 第一个问题关于弱类型 $str1 = 'yabadabadoo'; $s ...

  7. 如何用js实现截取一个字符串中的数字

    比如var v ="我要提问1098";var v="我0要提问"var v="我还是要提问987"等我想要里边的 1098 ,0, 987 ...

  8. mysql忘记密码的重置方法

    1. 编辑mysql主配置文件 my.cnfvim /etc/my.cnf在[mysqld]字段下的位置添加参数skip-grant保存退出2. 重启数据库服务service mysqld resta ...

  9. 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板

    网站:http://www.topeetboard.com 光盘资料+网盘资料+配套视频+售后支持,助您加速学习研发的进程 产品介绍 iTOP-Exynos4412开发板采用 Exynos4412的主 ...

  10. #include <NOIP2009 Junior> 细胞分裂 ——using namespace wxl;

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...