因为自己在学习这三个概念的时候,实在是走了很多的弯路,而且当我意识到这些概念在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. 树莓派加入定时任务实现花生壳定时重启(linux的定时任务)

    由于花生壳在linux下不稳定,联系开机一个星期左右会挂掉,所以要使用定时任务实现每小时刷新一次/启动一次. 使用的是linux下的定时任务crontab去实现. 实现步骤: 1.编辑/etc/cro ...

  2. CodeForces 732B Cormen — The Best Friend Of a Man (贪心)

    题意:给定n和k表示,狗要在任意连续两天散步次数要至少为k,然后就是n个数,表示每天的时间,让你增加最少次数使得这个条件成立. 析:贪心,策略是从开始到最后暴力,每次和前面一个相比,如果相加不够k,那 ...

  3. Spring MVC Framework 注解

    ControllerAdvice Spring MVC Framework会把 @ControllerAdvice注解内部使用 @ExceptionHandler.@InitBinder.@Model ...

  4. hash_map vs unordered_map vs map vs unordered_set

    hash_map vs unordered_map 这两个的内部结构都是采用哈希表来实现.unordered_map在C++11的时候被引入标准库了,而hash_map没有,所以建议还是使用unord ...

  5. '用Roslynpad做一个轻量级的C#编辑器'

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:'用Roslynpad做一个轻量级的C#编辑器'.

  6. Oracle-11g-R2 于 Linux 上的 RAC 卸载

    安装环境: SuSE Linux Enterprise Server 11 SP3 Oracle 11g 11.2.0.3   卸载步骤: 1.卸载 Database 软件(oracle,第一节点) ...

  7. XSS攻击:SOHU视频XSS漏洞导致其用户成为DDOS肉鸡

    XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入当中Web里面的html代码会被运行,从而达到恶意攻击用 ...

  8. Tomcat安装、配置、优化及负载均衡详解

    一.常见JavaWeb服务器      1.WebLogic:是BEA公司的产品.WebSphereAS:是IBM公司的产品.JBossAS:红帽公司的产品,可以自行了解      2.Tomcat服 ...

  9. Android 滑动效果高级篇(八)—— 自定义控件

    自定义控件,较常用View.ViewGroup.Scroller三个类,其继承关系如下: 本示例自定义控件,实现一个Gallery效果,并添加了一个显示View个数和位置的bar条,效果图: 自定义控 ...

  10. mha 自动failover 原创

    自动failover slave1:stop slave io_thread slave2stop slave io_thread server1:   create database sbtest; ...