《Objective-C基础教程》第13章 协议

第13章 协议

13.1 正式协议

与非正式协议一样,正式协议包含了方法和属性的有名称列表。
不同的是,正式协议要求显式地采用(在@interface声明中列出协议的名称)
采用协议之后,类就要遵守该协议,实现该协议的所有方法

13.1.1 声明协议

@protocol NSCopying
  -(id) copyWithZone:(NSZone *) zone;
@end

继承父协议

@protocol MySuperDuberProtocol <MyparentProtocol>
-(void)....//需要实现的方法
@end

通常可以使用NSObject作为根协议(不要将其与NSObject类混淆)NSObject类复合NSObject协议,这意味着所有的对象都符合NSObject协议

13.1.2 采用协议

@interface Car:NSObject<NSCopying,NSCoding>
{
// instance variables
}
//methods
@end //Car

13.2 协议和数据类型

可以在数据类型中为实例变量和方法参数制定协议名称,有助于检查代码中的错误。

-(void)setObjectValue:(id<NSCopying>)object;

编译器将知道setObjectValue:接受任意类型的对象作为参数,但前提是要遵守该协议。否则会发生告警。

13.3 Objective-C 2.0 的新特性

@optional
-(void)...//不一定要实现
@required
-(void)...//一定要实现

非正式协议已经被替换成带有@optional方法的正式协议。

13.4 委托方法

委托(delegation)是一个经常与协议共用的特性。委托就是某个对象指定另一个对象处理某些特定任务的设计模式。

使用委托来执行相应方法时,代码首先询问委托是否拥有这个方法的实现,如果实现了,它就会要求委托处理这个方法。

示例
A.h
@protocol Mydelegate//协议的声明
-(void)Fun;
@end

@interface A:NSObject
{
   id<Mydelegate> delegate;//声明一个委托对象,我们要把事情委托给实现Mydelegate协议的类
}
@property(assign,nonatomic) id<Mydelegate> delegate;
@end
A.m
@implementation
-(void)init
{
    delegate = B;
}

-(void)FunToOther
{
    [delegate Fun];//将消息发送给委托去处理
}
@end
委托对象的实现
B.h
#import"A.h"
@interface B:NSObject<MyDelegate>
@end
B.m
@implementation
-(void)fun
{
    //实现Mydelegate中制定的方法
}
@end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章