OC-protocol

from : http://www.cnblogs.com/wendingding/p/3709604.html

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

2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。

3.只要父类遵守了某个协议,那么子类也遵守。

4.Protocol声明的方法可以让任何类去实现,protocol就是协议。

5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)

6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。

7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。

 1 //
 2 //  MyProtocol.h
 3 //  WDDDelegateTest
 4 //
 5 //  Created by LiuChanghong on 15/9/26.
 6 //  Copyright © 2015年 LiuChanghong. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 //MyProtocol协议,这个协议遵守NSObject基协议
12 @protocol MyProtocol <NSObject>
13 //在协议中可以声明很多有用的方法,但不能声明变量,也不能实现方法
14 @required
15 //required 必须要求实现
16 -(void)myName;
17 -(void)myAge;
18
19 @optional
20 //optional 可选
21 -(void)myMomsName;
22
23
24 @end

MyProtocol.h

 1 //
 2 //  MyProtocol2.h
 3 //  WDDDelegateTest
 4 //
 5 //  Created by LiuChanghong on 15/9/26.
 6 //  Copyright © 2015年 LiuChanghong. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @protocol MyProtocol2 <NSObject>
12
13 @required
14
15 -(void)studentName;
16 -(void)studentAge;
17
18 @end

MyProtocol2.h

 1 //
 2 //  Person.h
 3 //  WDDDelegateTest
 4 //
 5 //  Created by LiuChanghong on 15/9/26.
 6 //  Copyright © 2015年 LiuChanghong. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "MyProtocol.h"
11
12 @interface Person : NSObject<MyProtocol>//遵守协议
13
14 @property (nonatomic,strong)NSString *personName;
15
16 @end

Person.h

 1 //
 2 //  Person.m
 3 //  WDDDelegateTest
 4 //
 5 //  Created by LiuChanghong on 15/9/26.
 6 //  Copyright © 2015年 LiuChanghong. All rights reserved.
 7 //
 8
 9 #import "Person.h"
10
11 @implementation Person
12
13 //required
14 -(void)myAge{
15     NSLog(@"My age is 18 .");
16 }
17
18 -(void)myName{
19     NSLog(@"My name is Mike");
20 }
21
22 //optional
23 -(void)myMomsName{
24     NSLog(@"可选的My mom‘s name is Lucy .");
25 }
26
27 @end

Person.m

 1 //
 2 //  Student.h
 3 //  WDDDelegateTest
 4 //
 5 //  Created by LiuChanghong on 15/9/26.
 6 //  Copyright © 2015年 LiuChanghong. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "MyProtocol2.h"
11 #import "MyProtocol.h"
12
13 @interface Student : NSObject<MyProtocol2,MyProtocol>
14
15 @end

Student.h

 1 //
 2 //  Student.m
 3 //  WDDDelegateTest
 4 //
 5 //  Created by LiuChanghong on 15/9/26.
 6 //  Copyright © 2015年 LiuChanghong. All rights reserved.
 7 //
 8
 9 #import "Student.h"
10
11 @implementation Student
12
13 -(void)studentName{
14     NSLog(@"Student‘s name is Mary .");
15 }
16
17 -(void)studentAge{
18     NSLog(@"Student‘s age is 14 .");
19 }
20
21 -(void)myAge{
22     NSLog(@"My age is 20 .");
23 }
24
25 -(void)myName{
26     NSLog(@"My name is Lucky .");
27 }
28
29 @end

Student.m

 1 //
 2 //  main.m
 3 //  WDDDelegateTest
 4 //
 5 //  Created by LiuChanghong on 15/9/26.
 6 //  Copyright © 2015年 LiuChanghong. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11 #import "Student.h"
12
13 int main(int argc, const char * argv[]) {
14     @autoreleasepool {
15
16         Person *person = [Person new];
17
18         [person myName];
19         [person myAge];
20         [person myMomsName];
21
22         Student *student = [Student new];
23         [student myName];
24         [student myAge];
25         [student studentAge];
26         [student studentName];
27
28     }
29     return 0;
30 }

测试

输出结果

1.协议的定义

@protocol 协议名称 <NSObject>

//方法声明列表

@end;

2.如何遵守协议

(1)类遵守协议

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

@end

(2)协议遵守协议

@protocol 协议名称 <其他协议名称>

@end;

3.协议方法声明中的关键字

(1)required (默认)要求实现,若没有实现则警告但不报错

(2)Optional 不要求实现

4.定义变量时遵守协议的限制

类名<协议名称> *变量名    NSObject<.Myprotocol> *obj;

Id  <协议名称>  变量名   id  <.Myprotocol> obj1;

5.Property中声明的属性也可以做遵守协议的限制

@property (nonatomic ,strong ) 类名<协议名称> *属性名;

@property (nonatomic ,strong ) id<协议名称>  属性名;

6.补充知识:协议本身写在.h头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。

时间: 2024-10-12 17:02:56

OC-protocol的相关文章

14、OC —— Protocol

1.protocol(协议)类似java中的接口,定义了一些类需要公用到的方法,只要遵守这个协议,就可以拥有这些方法并可以去实现它们,这样可以避免许多重复的代码. 比如,一个Teacher(老师)类,一个Student(学生)类 老师有goToClassroom(去教室),goToToilet(去厕所),goToOffice(去办公室)等方法,学生也有 这样Teacher类和Student类都需要声明重复的代码 Teacher.h #import <Foundation/Foundation.h

OC中protocol、category和继承的区别

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

OC基础--分类(category) 和 协议(protocol)

OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低,导致了分类文件和协议文件没有找到,最后百度得知: 如图:Xcode 7.2版本中的category文件和protocol文件都归类到了Objective-C File 中   一.category文件: 作用:可以扩展自定义类,或者系统类.下面的实例,是扩展了NSString 类,在类中扩展了计算字

OC中的protocol

一. 简单使用 1. 基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了 2. 格式 协议的编写 @protocol 协议名称 // 方法声明列表 @end 某个类遵守协议 @interface 类名 : 父类 <协议名称> @end 3. 关键字 协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流 @required:这个

黑马程序员——OC语言的Block与Protocol(协议)

Block ● Block封装了一段代码,可以在任何时候执?行 ● Block可以作为函数参数或者函数的返回值,?而其本?身又可以带输?入参数或返回值. ● 苹果官?方建议尽量多?用block.在多线程.异步任 务.集合遍历.集合排序.动画转场?用的很多 定义BLOCK变量 Int (^SumBlock)(int,int);//有参数,返回值类型为int Void (^MyBlock)()://无参数,返回值类型为空 Blocks的定义: int (^MySum)(int, int) = ^(i

OC基础-protocol

protocol(协议)的声明看起来比较向java中得一个类的接口,但是不同点在于:protocol没有父类也不能定义实例变量. protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法. 常见使用场合: 1.需要由别的类来实现的方法 2.声明未知类的接口 3.两个类之间的通信 protocol的基本特点: 协议可以被任何类实现的方法 协议本身不是类,他是定义了一个其他类可以实现的接口. 类别也可以采用协议(用得不多) protocol中得关键字: @required :表示必须

【OC基础】02-分类(Category)和协议(Protocol)

一.分类(Category) (1).分类的基础知识 分类是在不改变原有类内容的基础上,为类增加一些方法的方式. (2).分类的注意事项 1>分类只能增加方法,不能增加成员变量; 2>在分类方法的实现中可以访问原来类中的成员变量: 3>分类中可以重新实现原来类中的方法,但是这样会导致原来的方法无法在使用 4>在大规模应用中.通常把相应的功能写成分类,对原有的类进行扩充,一般分模块写,一个模块一个分类 二.分类的实现 我们可以再上一节Student类的基础上增加分类: CateStu

OC 类目(category) 延展(extension) 协议(protocol)(摘抄)

Objective-c中提供了可以让我们扩展类定义的手段:类目,延展和协议.类目:为已知的类增加新的方法:延展:通知在本类的定义里使用类目来声明私有方法:协议:协议声明了可以被任何类实现的方法. 注意:这些手段只能增加类的方法,并不能用于增加实例变量,要增加类的实例变量,只能通过定义子类来间接实现. 1.类目 1)声明类目 @interface NSString (NumberConvenience) -(NSNumber *)lengthAsNumber; @end 该声明具有2个特点.首先,

「OC」block 和 protocol

一.block   (一)简介 block 是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,block 可以在任何时候执行.在多线程.异步任务.集合遍历.集合排序.动画转场用的很多. block 和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. 标识符 ^ (二)基本使用 (1)定义block 变量 // 有参数,返回值类型为int int (^MySum)(int, int) = ^(int a, int b) { return

黑马程序员——OC学习小结------arc,block,protocol(协议)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.ARC的判断准则:只要没有强指针指向对象,就会释放对象 1.ARC特点 1> 不允许调用release.retain.retainCount 2> 允许重写dealloc,但是不允许调用[super dealloc] 3> @property的参数 * strong :成员变量是强指针(适用于OC对象类型) * weak :成员变量是弱指针(适用于OC对象类型) * assign