因为自己在学习这三个概念的时候,实在是走了很多的弯路,而且当我意识到这些概念在cocoa中很重要时,我便更糊涂了…或许从C++或者Java转过来的高手一看就明白,所以高手您随便拍砖,指正我的错误;新手的话,不妨稍微看看,说不定对你理解这三个概念有些帮助。

 
总的来说,这三个概念的用途是:扩充已存在类的功能,说白了,就是给已经有的类加上其他的功能。 
 
首先最常用的办法是,建立子类,继承父类的特点,加上新的类的内容。好处不言自明,自由:你想创建一个什么样的类就创建什么样的类,想加什么加什么。前提是,你需要继承以前的方法和属性。但是灵活性带来的问题是,太麻烦。有时候,我们也许只想加一个方法,这样你就不得不重新写一个类,生成两个新的文件。费劲。 
 
于是乎我们有了category。它的最简单的用途就是给原有的类加新的方法。我们不需要新建一个类,就可以在原有的类基础上使用我们新的方法。 
 
我这里使用一个最为简单但也最为常用的例子:在NSArray中添加deepCopy的功能。 
 
如果我们使用子类,我们需要新建一个名为NSArrayWithDeepCopy的类,然后在这个类里面我们需要有如下的代码: 
 
#import  
 
@interface NSArrayWithDeepCopy:NSArray 
 
-(NSArray*)deepCopy; 
 
@end 
 
当然这里还会有相应的一大堆的实现代码,恩,很麻烦阿。如果使用category,代码如何呢?我们只需要在使用深度拷贝的类里加上下面的代码就成了: 
 
#import  
 
@interface NSArray (DeepCopy) 
 
-(NSArray*)deepCopy; 
 
@end 
 
 
大功告成。简单吧?反正我觉得这样挺简单的,呵呵。 
 
最后是delegate,代理。代理是个在cocoa里用的很多的概念,尤其是在你进行界面的编程时,几乎总会用到这个概念。代理作为一种扩充类功能的手段,他的长处在于,我们可以使用一个代理的代码来扩充不止一个类的功能。也就是说,一个代理可以是几个类的代理,这样代理的功能就可以扩充给对应的类。 
 
更为方便的是,代理作为一种在程序中埋藏的“彩蛋”,允许其他程序员对代理的功能作任意的修改,而不至于影响原有的类的功能,这样保证了良好的封装。举个常用的例子,我们要为关闭窗口写一个代理。这个代理怎么起作用的呢?其实在原来的窗口代码中,原来的程序员已经写下了“关闭窗口时,要执行代理方法XXX…”的语句,而他把这个代理方法的实现留给了你。你可以把这个代理方法写成是“直接关闭”,或者是“询问是否保存然后关闭”,或者是“询问是否保存,然后无论选择什么都不保存直接关闭…”。 
 
原理上说,代理是一个包含有我们在原先的类里想要执行的代码的类。大家可能常见一个例子是说,代理是一个用来帮你做决定的类,比如说你原来的类有什么动作,然后做这个动作的时候,需要其他某些功能的配合,这时候你可以使用代理,让代理来起这个“配合”的作用。因为代理的功能与类的行为密切相关,所以在cocoa中,代理方法往往会在名字里包含did,will的词语,表示代理方法是在何时将被调用。 
 
想要使用代理,首先,原类必须支持使用代理,也就是说,原来的类必须有一个delegate的接口,这样你在使用的时候,把你创建的代理类赋值给原来的类,这样原来的类如果遇到使用代理的某些方法,就会跑到你自己的代理类中寻求帮助。相比categary和subclass,代理的限制更多,因为你有时候只希望其他的程序员按照你希望的方式去扩充类的功能,但是实际应用的时候,代理让程序,特别是界面程序的设计,增加了很大的灵活性。 

关于delegate, category和subclass的更多相关文章

  1. LLVM example for main

    #include "llvm/IR/CallSite.h" #include "llvm/IR/Instruction.h" #include "ll ...

  2. SoftwareEngineering.APIDesign.iOS

    API Design for iOS/Mac (Objective-c Edition) 1. UI Control Library API的设计 和已有组件保持一致(例如: 使用标准的API, 模型 ...

  3. OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏

    //再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...

  4. 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  5. 基本语法 protocols Category extension

    转:http://blog.csdn.net/wangeen/article/details/16989529 protocol   本质就是一系列的method的声明,他并不像class是必须的选项 ...

  6. 转iOS中delegate、protocol的关系

    iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...

  7. BlocksKit初见:一个支持将delegate转换成block的Cocoa库

    简介 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展,将许多需要通过 delegate 调 ...

  8. c# 关键字delegate、event(委托与事件)[MSDN原文摘录][1]

    A delegate is a type that safely encapsulates a method, similar to a function pointer in C and C++. ...

  9. ios警告:Category is implementing a method which will also be implemented by its primary class 引发的相关处理

    今天在处理项目中相关警告的时候发现了很多问题,包括各种第三方库中的警告,以及各种乱七八糟的问题  先说说标题中的问题  Category is implementing a method which ...

随机推荐

  1. Object类、instanceof

    一.Object 1.所有类都默认继承至Object 2.两个常用的方法 2.1.toString:返回类的字符串描述,一般子类会重写用来打印属性 2.2.equals:默认比较两个对象的引用是否相同 ...

  2. 【Java】多线程冲突解决——同步锁

       转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827547.html    解决并行冲突最有效的方法就是加同步锁,主要有以下几种方法:   1:动态方法 ...

  3. DataGridView单元格合并

    本文章转载:http://www.cnblogs.com/xiaofengfeng/p/3382094.html 图: 代码就是如此简单 文件下载:DataGridView单元格合并源码 也可以参考: ...

  4. UML图示与代码对照

    本文转载:http://www.cnblogs.com/iamlilinfeng/archive/2012/08/29/2662740.html 一.类继承 1 public class Father ...

  5. Cocos2d-x——pthread的使用注意事项

    1:多线程所调用的成员方法定义为static. 2:互斥锁(pthread_mutex_t)定义在cpp文件的开头,并且也定义为static. 3:pthread_mutex_init方法尽量在最早的 ...

  6. Codeforces Testing Round #12 C. Subsequences 树状数组维护DP

    C. Subsequences Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/597/probl ...

  7. Linux(Debian) vps安装gnome桌面+VNC

      昨天转载了一篇关于在Linux VPS上安装xface桌面并VNC连接的文章,因为文章是基于CentOS系统来操作的,有热心读者希望有一个Debian下的类似的东西,这就促成了今天的这篇文字.需要 ...

  8. Scala中的构造器

    Scala中的构造器 Scala中的构造器分为两类,主构造器和辅助构造器 主构造器是通过类名后面跟的括号里加参数列表来定义 辅助构造器是通过关键字this定义 定义一个无参主构造器 class rec ...

  9. linux下使用find xargs grep查找文件及文件内容

    1,在某个路径下查文件. 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录. find /etc -name “*” ...

  10. iOS AR技术初体验,使用EasyAR示例程序的小白指南

    QQ前两天的传递火炬,是我第一次直接接触到AR.(虽然之前听同事说过,因为他喜欢玩游戏,PS.3DS等等都玩过,这个技术最开始就是从这里出现的).所以感觉很有趣,就想自己也试着搞一下玩玩...下面是我 ...