oc协议,延展,分类

来源:互联网 发布:vmware虚拟机网络桥接 编辑:程序博客网 时间:2024/05/21 06:47

 1分类(类目,category),目的是为没有源代码的类添加方法(只能添加方法,不能添加实例变量)

 是扩充一个类的功能的方式之一,为原有类扩充的方法会成为原类的一部分,使用即可

 分类也分为.h(接口部分),以及.m(实现部分)

 .h文件中填写方法的声明,.m文件中填写方法的实现

 分类的定义格式,@interface开头 +扩展类的类名(分类名) @end结束

例子:

.h文件

@interface NSString (Compare)

-(void)sayHi;

//两个字符串对象比较

-(NSComparisonResult)compareAgainst:(NSString *)anString;

@end


2.延展:

延展也是扩充类的一种方式,只不过延展扩充的内容是私有的,是在.m文件中定义的,

延展既可以扩展方法,也可以扩展实例变量,只不过是私有的,外界无法直接访问

延展是为有源代码的类扩充内容(因为没有源代码是拿不到.m文件的)

@interface Person ()

{

    NSString *_aa;

    NSString *_bb;//延展中添加私有实例变量

}

-(void)sayMorning;

-(void)sayAfternoon;

-(void)sayEvening;

@end


3.协议

协议的定义: @protocol 协议名称 <NSObject>

1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现

2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
3.只要父类遵守了某个协议,那么子类也遵守。
4.Protocol声明的方法可以让任何类去实现,protocol就是协议。
5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >
6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法
7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。 


例一:

@protocol TeachingProtocol <NSObject>

@optional//选择,可选的,被他修饰的方法服从协议的类可以选择实现(可以实现也可以不实现)

-(void)TeachKVC;

@required(默认) //必须做的,服从协议的类必须实现该方法

-(void)teachMemory;

@end

TeachingProtocol是子协议(任务清单的名字) <NSObject>是父协议,子协议也有父协议方法的声明)

例二:

@protocol WomanDelegate <NSObject>//marryProtocol <NSObject>

-(void)writeCode;//敲代码

-(void)cooking;//做饭

-(void)washClothes;//洗衣服

-(void)sweep;//扫地


<>表示服从协议,服从的协议写在<>之内

协议就相当于一个任务清单,规定所要做的操作(只有一系列方法的声明),谁服从协议谁就要实现协议中的方法(完成任务清单中的任务)所以协议只有.h文件,没有.m文件(协议与文件没有关系,一个文件中可以有多个协议)


3.如何遵守协议
(1)类遵守协议

@interface 类名:父类名 <协议名称1,协议名称2>


@end

3.协议方法声明中的关键字
(1)required (默认)要求实现,若没有实现则警告但不报错
(2)Optional 不要求一定实现,选择实现

4.定义变量时遵守协议的限制
类名<协议名称> *变量名    Man<WomanDelegate> *obj;
Id  <协议名称>  变量名   id  <WomanDelegate> obj1;
5.Property中声明的属性也可以做遵守协议的限制
@property (nonatomic ,strong ) 类名<协议名称> *属性名;
代理的语义特性为assign

@property (nonatomic, assign) id <WomanDelegate> delegate;//(代理的名字) //


注:可能要遵守的这份协议需要是任意类型的,所以我们统一找个id类型的代理来遵守协议
正好id类型的对象可以调用任何方法(不一定会实现,可能写了不会执行),但是我们可以让id类型的对象delegate调用需要调用的方法,然后我们让所需要遵守协议的类的对象赋给
delegate,

-(void)clothesDirty

{

    //让丈夫洗衣服

    [self.delegatewashClothes];

}

让代理去执行方法washClothes

比如创建一个man类遵守womam的协议,在main函数中创建一个man对象赋给womam的属性delegate(先这么理解)




 










0 0
原创粉丝点击