因为自己在学习这三个概念的时候,实在是走了很多的弯路,而且当我意识到这些概念在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. 基于OpenCV的iOS开发笔记(1)

    本系列文章采用的的开发环境为: 1)Xcode 6 2)OpenCV for iOS 3.0.0 -------------------分割线---------------------------- ...

  2. MEF 编程指南(六):导出和元数据

    声明导出解释了部件导出服务的基础知识和价值观(Values).有时候出于种种原因,导出关联信息是非常必要的.通常,用于解释关于功能公共契约的具体实现.允许导入满足约束要求的导出,或者导入所有可用的实现 ...

  3. DNS添加/修改/查询/删除A记录

    #查询DNS可用类 Get-WmiObject -Namespace root\MicrosoftDNS -List #查询所有资源记录 $mydns = [WMIClass]"ROOT\M ...

  4. php 算法之切割数组,不用array_chunk(),算法之二,取数组的差值,不用array_diff()

    用php写算法切割数组,不用array_chunk();算法例如以下所看到的. <?php //$array 数组 //$size 每一个数组的个数 //每一个数组元素是否默认键值 functi ...

  5. Codeforces Round #326 (Div. 2) D. Duff in Beach dp

    D. Duff in Beach Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/588/probl ...

  6. quartz 2.2.1 jdbc 连接池参数配置

    /** The JDBC database driver. */指定连接驱动 public static final String DB_DRIVER = "driver"; /* ...

  7. 解决使用DevExpress开发错误:未将对象引用设置到对象的实例

    在使用DevExpress是总是会出现一些状况.这次同事在他的机器上调试完成的代码发过来,却出现"未将对象引用设置到对象的实例"的错误,提示是Resources.resx的问题.另 ...

  8. [AngularJS] Consistency between ui-router states and Angular directives

    ui-router's states and AngularJS directives have much in common. Let's explores the similarities bet ...

  9. 小米2及其他Android手机无法连接mac解决方案

    一般的android连接mac 很方便不用安装驱动就可以啦,可是不知道为什么二般情况下有的android手机(小米2,华为等)就是连接不上,下来就说说二般情况下如何连接. 1.关于本机-->更多 ...

  10. php引用详解

    <?php function foo($bar){   $bar='111111111'; } $str='2222222222222'; foo($str); echo $str; //out ...