[iOS开发必备知识之] Category & Protocol

[iOS开发必备知识之] Category & Protocol,第1张

概述本文来源:http://devnote.me/page/4/ http://blog.codingmylife.com/?p=41 Categories 1 2 3 4 5 6 7 8 #import “ClassName.h” @interface ClassName ( CategoryName ) // method declarations @end #import “ClassName+


本文来源:http://devnote.me/page/4/

http://blog.codingmylife.com/?p=41

CategorIEs

1 2 3 4 5 6 7 8 #import “Classname.h” @interface Classname ( categoryname ) // method declarations @end #import “Classname+categoryname.h” @implementation Classname ( categoryname ) // method deFinitions @end

For example

8 9 10 11 12 13 14 15 16
@interface MyObject : NSObject{ NSNumber *number; } - (NSNumber *)number; @end @interface MyObject (Setter) - (voID)setNumber:(NSNumber *)newNumber; @end @implementation MyObject - (NSNumber *)number{ return number; } - (voID)setNumber(NSNumber *)newNumber{ number = newNumber; } @end

Protocol

@protocol MyProtocol- (voID)requiredMethod;@optional- (voID)anoptionalMethod;- (voID)anotherOptionalMethod;@required- (voID)anotherrequiredMethod;@end

For example

10
inherit multiple protocol. @interface Formatter : NSObject Instance. Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport); Check if methods are declared if(![receiver conformstoprotocol:@protocol(MyXMLSupport)]){ //Object does not conform to MyXMLSupport protocol //If you are expecting receiver to implement methods declared in the //MyXMLSupport protocol,this is probably an error }   -(Nsstring*)formattingService:(ID)anObject; ———————————————————————

http://icocoa.cn/ocsection/oc-tips/60-category-vs-protocol

category
category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,我们可以为任何已经存在的class添加方法(不包括数据成员)却不需要访问该class的实现文件。
新添加的方法和原有的方法具有同等的地位,可以访问class的数据成员,并且完全植入到class的继承体系之中,子类同样会继承新添加的方法。 利用category对类进行扩展可以避免使类的继承体系过于臃肿,复杂,降低了维护成本。另外,新添加的方法如果和已经存在的方法具有相同的 prototype,那么新添加的方法将会覆盖已经存在的方法,也就是category使得使得在没有源文件时修改已存在class的 functionality或者清除BUG成为可能,所有该class的对象的行为都将发生变化,这一点是继承无法达到的。

category的缺点:
如果一个已经存在的方法被新方法覆盖,那么将没有任何途径可以对旧方法进行调用。这一点和继承是不同的,子类对父类成员函数重写(overrIDe),但我们依然可以对父类中的被重写的成员函数进行调用。
如果有多个category对同一个class的成员函数进行重写,那么具体的行为是未定义。
category的应用:
对类进行扩展或patch。
使用category或(anonymous category)来模拟实现private method。
使用category(informal protocol)来实现delegation,在cocoa framework中就大量使用了category来声明delegate methods。
利用category把一个庞大的class划分为小块儿来分别进行开发,从而将functionality更好的进行划分,利于维护。

Protocol
根据字面意思,protocol就是一个协议,一个contract。一个class如果采用了某个protocol,那么它就必须要遵守这个协 议。从另外一个角度,只要我遵守了某个protocol或者标准,那我就可以和其它的类进行交互,而且其它类并不需要知道我的内部是如何实现的,例如 一套组合音响,只要其中的dvd,录音机等设备采用的是标准接口,那么它就可以很轻易的被放入这个音响系统中,发挥自己的功能。回到objective c,在cocoa touch framework中利用protocol声明delegate methods是同样的道理,cocoa touch framework,你们想要提供自定义功能或者响应某个事件吗?很简单,只要你们的功能遵守我提供的protocol。(注意,这里之所以采 用protocol来声明delegate methods,而不是cocoa framework中使用informal protocol(category),是因为objective c 2.0 引入了@optional methods,iphone又是在objective c 2.0之后出来的,所以cocoa touch framework中就用protocol替代informal protocol来声明delegate methods。)其实plugin,回调函数都是和protocol相同的思路。

另一方面,objective c只支持单一继承,protocol提供了一个途径来达到多重继承的目的。

另一介绍 Protocol文章:

http://www.cocoachina.com/bbs/read.PHP?tID-50601.HTML

协议,是通过网络,计算机使用者进行通讯后,互相进行约定规定的集合。两个类进行通讯,用协议就比较方便。下面是 CocoaChina 版主“angellixf”为新手写的协议入门介绍以及代码例子,希望对刚入门开发者有所帮助
一、说明
1.协议声明了可以被任何类实现的方法
2.协议不是类,它是定义了一个其他对象可以实现的接口
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5:委托,就是调用自己定义方法,别的类来实现。
6.新特性说明
@optional预编译指令:表示可以选择实现的方法
@required预编译指令:表示必须强制实现的方法

二、定义
.h

@protocol ContactCtrlDelegate-(voID)dismissContactsCtrl;@end   @interface ContactsCtrl : UIVIEwController {    ID <ContactCtrlDelegate> delegate;}@property (nonatomic,assign) ID <ContactCtrlDelegate> delegate;

.m

1
@synthesize delegate;

三、例子
例如:UITextVIEw

@protocol UITextVIEwDelegate <NSObject>   @optional   - (BOol)textVIEwShouldBeginEditing:(UITextVIEw *)textVIEw;- (BOol)textVIEwShouldEndEditing:(UITextVIEw *)textVIEw;   - (voID)textVIEwDIDBeginEditing:(UITextVIEw *)textVIEw;- (voID)textVIEwDIDEndEditing:(UITextVIEw *)textVIEw;   - (BOol)textVIEw:(UITextVIEw *)textVIEw shouldChangeTextInRange:(NSRange)range replacementText:(Nsstring *)text;- (voID)textVIEwDIDChange:(UITextVIEw *)textVIEw;   - (voID)textVIEwDIDChangeSelection:(UITextVIEw *)textVIEw;   @end

如果要调用以上这些方法,就必须设置UITextVIEw的委托:TextVIEw.delegate = self;

四、Demo

1、ContactsCtrl.h

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#import <UIKit/UIKit.h>   //定义协议 @protocol ContactCtrlDelegate -(voID)dismissContactsCtrl; @end   @interface ContactsCtrl : UIVIEwController { IBOutlet UINavigationbar *ContactNavbar; ID <ContactCtrlDelegate> delegate; } -(IBAction)canCelBtn:(ID)sender; @end 1   2、ContactsCtrl.m 1 @implementation ContactsCtrl @synthesize delegate;   // Implement vIEwDIDLoad to do additional setup after loading the vIEw,typically from a nib. - (voID)vIEwDIDLoad { [super vIEwDIDLoad]; ContactNavbar.topItem.prompt = @"选取联系人发送短信"; }   //调用协议中的方法 -(IBAction)canCelBtn:(ID)sender{ [delegate dismissContactsCtrl]; }

3、ProtocolDemoCtrl.h

5
#import <UIKit/UIKit.h> #import "ContactsCtrl.h" @interface ProtocolDemoCtrl : UIVIEwController <ContactCtrlDelegate>{//添加委托 ContactsCtrl *contactsVIEw; }

4、ProtocolDemoCtrl.m

24
#import "ProtocolDemoCtrl.h" #define barbuttonADD(SELECTOR) [[[UIbarbuttonItem alloc] initWithbarbuttonSystemItem:UIbarbuttonSystemItemAdd target:self action:SELECTOR] autorelease];   @implementation ProtocolDemoCtrl @synthesize contactsVIEw;   - (voID)vIEwDIDLoad { [super vIEwDIDLoad]; self.navigationItem.rightbarbuttonItem = barbuttonADD(@selector(addContactAction:)); }   - (voID)addContactAction:(ID)sender{ ContactsCtrl *contactVIEw = [[ContactsCtrl alloc] initWithNibname:@"ContactsCtrl" bundle:nil]; self.contactsVIEw = contactVIEw; contactsVIEw.delegate = self;//设置委托 [self presentModalVIEwController:contactsVIEw animated:YES]; [contactVIEw release]; }   //实现ContactCtrlDelegate协议中的方法 -(voID)dismissContactsCtrl{ [contactsVIEw dismissModalVIEwControllerAnimated:YES]; }
总结

以上是内存溢出为你收集整理的[iOS开发必备知识之] Category & Protocol全部内容,希望文章能够帮你解决[iOS开发必备知识之] Category & Protocol所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1061909.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存