关于delegate, category和subclass

因为自己在学习这三个概念的时候,实在是走了很多的弯路,而且当我意识到这些概念在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,代理的限制更多,因为你有时候只希望其他的程序员按照你希望的方式去扩充类的功能,但是实际应用的时候,代理让程序,特别是界面程序的设计,增加了很大的灵活性。

时间: 2024-08-09 10:29:23

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

LLVM example for main

#include "llvm/IR/CallSite.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/Module.h" #include "llvm/IRReader/IRReader.h" #

SoftwareEngineering.APIDesign.iOS

API Design for iOS/Mac (Objective-c Edition) 1. UI Control Library API的设计 和已有组件保持一致(例如: 使用标准的API, 模型,模式)可以使Developer更易理解. Class interface Rule1: 使用该平台常用/通用的术语或者名字 (Use the local dialect) 在编码前学习该平台的习俗或者惯例:学习并理解protocol, delegate, category分别是什么:遵循内存管理规

iOS 设计模式

Ios 设计模式,你可能听说过,但是你真正知道这是什么意思么?大部分的开发者大概都同意设计模式很重要,但是关于这一部分却没有很多的文章去介绍它,我们开发者很多时候写代码的时候也并不重视设计模式. 设计模式是在软件设计上去解决普通问题的可重用的方法.他们是是帮助你让所写的代码更加容易理解和提高可重用性的模板.它们还可以帮你创建松散耦合的代码是你能不费很大功夫就可以改变或者替代你的代码中的一部分. 如果你对设计模式感到生疏,那么我有个好消息告诉你!首先,你已经用了很多ios设计模式多亏了Cocoa

category、protocol、delegate总结

一.category(类别) 类别是一种类扩展的机制,能为现有的类添加新方法. ①类别的基本语法 @interface部分,如: @interface NSString (NumberConvenience) - (NSNumber *) lengthAsNumber; @end 我们为NSString类添加了名为NumberConvenience的类别. 注: 类别只可以添加方法,不可以添加实例变量 类别可以添加属性,但属性必须是@dynamic类型的  @implementation部分 @

第七讲.NSDate,category(分类),extension(延展),protocol(协议),delegate(代理)

一.掌握NSDate和NSDateFormatter的使用 NSDate是Cocoa中?用于处理日期和时间的基础类,封装了某一给定的时刻(含日期,时间,时区). 了解NSDate的创建,如何计算当前时间,时间间隔,以及时间日期与字符之间的互转. 1>.NSDate创建,当地时间计算,时间按间隔计算,时间与字符之间的互转 练习题1:计算当前时间与一个固定时间按的时间差 练习二:字符串转化为日期对象 二.掌握Category的定义和使用(只能为类扩展类方法或实例方法) 1.主要作用是为:没有源代码的

类的扩展(Extension , NSData, NSDateFormatter, Category, Extension, Protocol, delegate)

类的扩展         OC数据类型         1.NSInteger, NSUInteger         2.CGFloat         3.NSString, NSMutableString         4.NSArray, NSMutableString         5.NSNumber         6.NSDictionary, NSMutableDictionary         7.NSSet, NSMutableSet              NSD

Delegate、Category、Extension

Delegate 是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成. delegate的方法在被委托的类中必须实现. 设计模式中的委托模式. Category 即使在你不知道一个类的源码情况下,向这个类添加扩展的方法. 通过在interface中声明一个额外的方法并且在implementation 中定义相同名字的方法即可,不必实现.分类的名字(括号括起来)表示的是:对于声明于其他地方的这个类,在此处添加的方法是额外的,而不是表示这是一个新的类.你不可以通过分类为一个类添

iOS Category与Extension、Delegate的认识

Catrgory与Extension.Delegate的区别与用法 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #import @interface NSObject (Category) - (void)myMethod; @end 这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法. 使用Categor

OC中protocol、category和继承的区别

利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Category.Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract class的实现方式(oc 语法上本身不支持抽象基类).Category可以为类提供额外的接口和实现.那么到底三者(继承, Protocol,Category)在使用上到底有什么本质的区别呢?在我看来,protocol的作